Ich kämpfe mit folgendem Code:
#include <xc.h>
#include "config.h"
void Init(void);
void uart_send(char*);
void main(void)
{
char arr[2]= {'a','b'};
char i=0;
Init();
uart_send(arr+i);
i++;
uart_send(arr+i);
while(1);
}
void uart_send(char* c)
{
while(PIR1bits.TXIF < 1);
TXREG= *c;
}
void Init(void)
{
OSCCON = 0xef;
TRISBbits.RB7 = 0;
ANSELHbits.ANS11 = 0;
PORTBbits.RB5 = 0;
TRISBbits.RB5 = 1;
BAUDCON = 0x00;
BAUDCONbits.BRG16= 1;
SPBRGH = 0x03;
SPBRG = 0x40;
TXSTA= 0x24;
RCSTA= 0x90;
PIE1 = 0x00;
INTCON = 0x00;
RCSTAbits.CREN = 1;
}
Im ersten Fall rufe ich die Funktion uart_send auf und erhalte 'a'. Im zweiten Fall erhalte ich beim erneuten Aufruf der Funktion ebenfalls 'a' statt 'b'. Ich kann es nicht herausfinden, warum. Wenn ich den Code ändere, um Wert anstelle von Adresse zu verwenden:
void uart_send(char);
void main(void)
{
char arr[2]= {'a','b'};
char i=0;
Init();
uart_send(*(arr+i));
i++;
uart_send(*(arr+i));
while(1);
}
void uart_send(char c)
{
while(PIR1bits.TXIF < 1);
TXREG= c;
}
Dann erhalte ich in beiden Fällen 0x03.
Ich verwende MPLAB X v3.30, XC8 1.37, PIC18F14K50
Bitte, wenn Sie eine Ahnung haben, was ich falsch mache, teilen Sie es mit. Danke schön.
AKTUALISIEREN:
Ich habe die Disassy überprüft und es sollte funktionieren. Vielleicht ist mein MCU teilweise gestorben oder etwas Magisches ...
Sie geben Ihre beabsichtigte Baudrate nicht an, aber ich gehe davon aus, dass sie 9600 bps beträgt. Wenn ja, stellen Sie die Baudrate falsch ein.
Durch die Verwendung des internen Oszillators stellen Sie die Oszillatorfrequenz des Mikrocontrollers auf 16 MHz ein, Sie setzen auch die BRG16- und BRGH-Bits auf 1, sodass die Baudratenformel Fosc/[4*(n+1)] ist, wobei n die ist SPBRG-Wert, den Sie auf 832 setzen.
Indem Sie die Werte durch die bereitgestellten ersetzen, haben Sie:
So:
Daher sollte Ihr SPBRG-Wert 0x1A0 sein.
Vor 2 Jahren, aber ich erinnere mich an dieses lästige Problem. Schließlich habe ich einen neuen PIC gekauft, dann das gleiche Programm geflasht. Korrekt gearbeitet.
Fazit: Der erste mcu ist (teilweise) gestorben.
Tom Tischler
i
Typuintptr_t
zu erstellen (der Typ sollte in definiert seinstdint.h
). Es ist möglich, dass Sie mit seltsamen Integer-Überläufen enden - es ist nicht gerade der beste Compiler der Welt.efox29
Peter Pal
Peter Pal
efox29
Peter Pal
Dan Laks
efox29
Peter Pal
Peter Pal
LeitungZum Verkauf
LeitungZum Verkauf