Hi, ich bin jetzt schon eine ganze Weile am Probieren eine Möglichkeit zu finden meinem atmega16 8bit Werte über die serielle Schnittstelle zu übergeben. Am Ende soll damit eine Software PWM gesteuert werden, allerdings liegt das Problem schon bei der Kommunikation. Der Übersicht und Fehlersuche halber habe ich mal die Empfangsroutine aus meinem anderen Programm übernommen. Das Programm hängt in einer Endlosschleife und springt interruptgesteuert in die Empfangsroutine. Der empfangene Wert wird dann auf PortA ausgegeben PinB0 wird bei jedem Sprung in die Routine getoggelt. Soweit dazu was das Programm tun SOLLTE ;). Im Testbetrieb allerdings zeigt mir mein atmega am PortA absolut nicht das an was ich ihm per Terminal schicke. Meine Frage ist nun ob es schon ein Software Problem ist, oder ob ich den Fehler woanders suchen muss. Der einzige Punkt der mir kritisch erscheint ist die Zuweisung der Variablen buffer(unsigned char) zu PortA (bzw. später zu einer int Variablen). Könnte es sein dass diese Konvertierung Probleme macht? angefügt ist der Code des Testprogramms mit dem ich im Moment arbeite. Auf meinem Board ist ein 8,192MHz Kristall(um die Initialisierung zu erklären)
> Auf meinem Board ist ein 8,192MHz Kristall
Ich hoffe, es handelt sich dabei um einen Quarzkristall. ;-)
Anyway, hast du den Quarz auch aktiviert?
Hmm. Welche Baudrate willst du verwenden? Wenn ich die übliche Formel anwende #define UBRR_BAUD ((F_CPU)/(16*(BAUD))-1) und für F_CPU 8192000 einsetze, BAUD 9600, dann komme ich nicht auf deine Werte UBRRH = 0; UBRRL = 64; auch nicht für eine Baudrate von 4800. Ich schlage mal vor, du machst sie Initialisierung so: #define F_CPU 8192000UL #define BAUD 9600UL // USART BAUD #define UBRR_BAUD ((F_CPU)/(16*(BAUD))-1) void UARTinit() { UCSRB |= ( 1 << TXEN )|(1 << RXEN)|(1<<RXCIE); UCSRC |= ( 1 << URSEL )|( 1<<UCSZ0 )|( 1<<UCSZ1 ); UBRRH = (uint8_t) (UBRR_BAUD>>8); // USART Baud UBRRL = (uint8_t) UBRR_BAUD; } dann kümmert sich der Compiler um die Berechnung. PS: toggle = (toggle+1)%2; Das ist etwas umständlich. Für den Fall das toggle von vorne herein nur einen Wert von entweder 0 oder 1 hat (durch Initialisierung sicher gestellt), ist dies toggle = 1 - toggle; viel kürzer und weniger rechenintensiv.
> ist dies > toggle = 1 - toggle; > viel kürzer Oder toggle ^= 1;
Hi ihr 2, also als Baudrate hatte ich eigentlich 9600 eingestellt, den Wert hatte ich aus einer Tabelle. Quarz ist auch soweit eingestellt, bzw die fuses gesetzt. Ich werde jetzt dann mal deinen Code versuchen ob ich damit mehr erfolg habe. Vielen Dank auf jeden Fall schonmal für die Antworten, ich werd mich wieder melden :).
Hallöchen, scheint alles zu funktionieren, hab eben auch schon mit dem eigentlichen Programm und der neuen Initialisierung gearbeitet und gemessen. Es scheint soweit alles zu funktionieren. Hätte ich wohl von Anfang an wen fragen sollen der sich damit auskennt ;). Danke nochmal mfG Thomas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.