Hallo, ich weiss nicht mehr weiter: Ich habe eine Atmega32PAPU mit zwei seriellen Ports und habe mich an die Codebeispiele aus dem Datenblatt gehalten, bekomme aber immer nur 80 00 im Terminalprogramm ausgeworfen. Wenn ich "11" schicke dann erhalte 80 80 00. Hat jemand eine Idee, was ich falsch mache ? #ifndef F_CPU #define F_CPU 8000000UL #endif #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <string.h> #include <stdlib.h> void USART_Init( unsigned int baud ) { // Set baud rate UBRR0H = (unsigned char)(baud>>8); UBRR0L = (unsigned char)baud; // Enable receiver and transmitter UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Set frame format: 8data, 2stop bit UCSR0C = (1<<USBS0)|(1<<UCSZ00); } void usart_putint(int zahl) { while(!(UCSR0A & (1<<UDRE0)));//warten auf Datenregister empty UDR0=zahl; } void main() { USART_Init(51); // 51 = 9600 while (1) { usart_putint(44); } }
Du stellst hier nur 6 Bit Datenbreite ein. Soll das so? UCSR0C = (1<<USBS0)|(1<<UCSZ00); Für 8 Bit müsste es zu UCSR0C = (1<<USBS0)|(1<<UCSZ10)|(1<<UCSZ00); werden.
Mit welcher Taktfrequenz läuft dein ATMega wirklich? Lass doch mal eine LED im Sekundentakt blinken. Und noch ein Tipp: Dein putint(44) gibt mitnichten eine Zahl mit Vorzeichen aus (ein "int") sonder ein einzelnes Byte. In deinem Fall ist es 44dez=0x2c=","
Der Tip mit den LEDs war schonmal ein Volltreffer. Ich Trottel hab schlichtweg vergessen, den externen Oszillator einzustellen. Jetzt blinken die LEDs auch im Sekundentakt. Gelöst ist das Problem aber noch nicht. Wenn ich eine 1 Sende, kommt 192 an. Ich habe das eben mit dem Code auf einer Atmega32 getetstet, mit angepassten Registern natürlich und da funktionierts. Der Terminal gibt mir genau das aus, was ich schicke... Wie bekomm ich denn jetzt ohne grosse Rummrechnerei die INT Werte übertragen ?
Wenn du nicht den ATmega32 meintest, was ist dann ein ATmega32PAPU? Den finde ich bei Atmel nicht. Nichtmal per Suchmaschine...
Sorry : Atmega324PAPU der hier ist es: http://www.reichelt.de/ATMEGA-324PA-PU/3/index.html?&ACTION=3&LA=446&ARTICLE=121841&artnr=ATMEGA+324PA-PU&SEARCH=atmega32
Felix Adam schrieb: > Du stellst hier nur 6 Bit Datenbreite ein. Soll das so? > > UCSR0C = (1<<USBS0)|(1<<UCSZ00); > > Für 8 Bit müsste es zu > > UCSR0C = (1<<USBS0)|(1<<UCSZ10)|(1<<UCSZ00); > > werden. Das gilt laut Datenblatt auch für ATmega324P.
Vielen Vielen Dank ! Funktioniert jetzt ! Am Ende doch noch Probleme mit Baudrate, Stopbits etc. Habt mir den Sonntag gerettet !
In dem Fall würde mich interessieren, warum das so ist (das mit den 6 Bits.)
:
Bearbeitet durch User
Hallo Tom, tom schrieb: > ich weiss nicht mehr weiter: Ich habe eine Atmega32PAPU mit zwei > seriellen Ports und habe mich an die Codebeispiele aus dem Datenblatt > gehalten, bekomme aber immer nur 80 00 im Terminalprogramm ausgeworfen. > Wenn ich "11" schicke dann erhalte 80 80 00. Einen Atmega32PA-PU finde ich bei Atmel nicht. Die neueren Atmega32A haben nur eine "A" angehängt. http://www.atmel.com/devices/ATMEGA32A.aspx Aber die haben alle nur ein Uart !
Hallo Tom, tom schrieb: > ich weiss nicht mehr weiter: Ich habe eine Atmega32PAPU mit zwei > seriellen Ports und habe mich an die Codebeispiele aus dem Datenblatt > gehalten, bekomme aber immer nur 80 00 im Terminalprogramm ausgeworfen. > Wenn ich "11" schicke dann erhalte 80 80 00. Einen Atmega32PA-PU finde ich bei Atmel nicht. Die neueren Atmega32A haben nur ein "A" angehängt. http://www.atmel.com/devices/ATMEGA32A.aspx Aber die haben alle nur ein Uart !
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.