Nun da mein alter Beitrag eine falsche Überschrift hatte, versuche ich das hier erneut. Ich habe ein kleines Testprogramm geschrieben. Sicherlich sind da noch einige Fehler drin. Vielleicht kann da mal einer drüberschauen. Ich lass eine LED blinken und ein Zeichen über RS232 senden. Das mit dem blinken der LED klappt. Der rest noch nicht.
Mögt ihr denn eine ZIP Datei? Oder gibt es noch andere Vorschläge. Schön währe es wenn statt meckern auch Hilfe kommt.
Thorsten Grube wrote: > Mögt ihr denn eine ZIP Datei? Ist zwar besser, aber ein kleines Testprogramm muss man überhaupt nicht als Archiv schicken! > Oder gibt es noch andere Vorschläge. Schön währe es wenn statt meckern > auch Hilfe kommt. Ach, so ist das! Dann mach Deinen Dreck allein!
Sind ja immerhin zwei Dateien im Archiv.
1 | UBRRH = (unsigned char)(UART_BAUD_RATE>>8); |
2 | UBRRL = (unsigned char)UART_BAUD_RATE; |
Das wäre schön, wenn die Berechnung der Registerwerte so einfach wäre. Ist sie aber nicht. Schau ins Datenblatt, und dann in die Doku der avr-libc. Da gibt es <util/setbaud.h>, der nimmt dir viel Arbeit ab. Oliver
hey Jungs, seit doch nicht so garstig.... Er hat doch geschrieben, dass er noch neu ist und nicht weiß wie er sich konform verhält. Hier mal ein Beispiel für eine UART-Initialisierung (ist zwar für einen ATmega162, sollte aber mit Registernamensänderung auch auf einem ATm32 laufen). Quarzfrequenz sollte auch auf deine Quarzfrequenz eingetragen werden.
1 | #define F_CPU 14745460 // Quarz 14.74546 MHz
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/interrupt.h> |
5 | #include <util/delay.h> |
6 | #include <string.h> |
7 | #include <stdbool.h> |
8 | |
9 | void uart0_init(int BaudRate) |
10 | {
|
11 | int ubrr0 = (F_CPU / 16 / BaudRate - 1); // Baudrate UART0 einstellen |
12 | UBRR0H = (unsigned char)(ubrr0>>8); |
13 | UBRR0L = (unsigned char)ubrr0; |
14 | |
15 | UCSR0C = (1<<URSEL0)|(3<<UCSZ00); // UART0 Frame Format einstellen: 8data, 1 Stop-bit, keine Parity |
16 | UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1 << RXCIE0); // UART0 Receiver und Transmitter einschalten |
17 | }
|
18 | |
19 | |
20 | int main() // Hauptprogramm |
21 | |
22 | {
|
23 | |
24 | uart0_init(9600); // USART0 initialisieren (Baudrate auf 9600 ) |
25 | |
26 | |
27 | //DEIN PROGRAMM
|
28 | |
29 | |
30 | return 0; |
31 | }
|
Danke für die Tipps. so sieht das Programm jetzt aus, nachdem ich es für ATMEGA32 abgeändert habe.
1 | #define F_CPU 8000000
|
2 | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
4 | #include <util/delay.h> |
5 | #include <string.h> |
6 | #include <stdbool.h> |
7 | |
8 | unsigned char leds = 0x04; |
9 | |
10 | void uart0_init(int BaudRate) |
11 | {
|
12 | int ubrr0 = (F_CPU / 16 / BaudRate - 1); // Baudrate UART0 einstellen |
13 | UBRRH = (unsigned char)(ubrr0>>8); |
14 | UBRRL = (unsigned char)ubrr0; |
15 | |
16 | UCSRC = (1<<URSEL)|(3<<UCSZ0); // UART0 Frame Format einstellen: 8data, 1 Stop-bit, keine Parity |
17 | UCSRB = (1<<RXEN)|(1<<TXEN)|(1 << RXCIE); // UART0 Receiver und Transmitter einschalten |
18 | }
|
19 | |
20 | |
21 | void USART_Transmit( unsigned char data ) |
22 | {
|
23 | /* Wait for empty transmit buffer */
|
24 | while ( !( UCSRA & (1<<UDRE)) ); |
25 | {
|
26 | /* Put data into buffer, sends the data */
|
27 | UDR = data; |
28 | }
|
29 | }
|
30 | |
31 | int main(void) // Hauptprogramm |
32 | |
33 | {
|
34 | |
35 | uart0_init(9600); // USART0 initialisieren (Baudrate auf 9600 ) |
36 | |
37 | |
38 | //DEIN PROGRAMM
|
39 | while (1) |
40 | {
|
41 | USART_Transmit( 'H'); |
42 | /*LED an */
|
43 | _delay_ms(500); |
44 | leds = 0x04; |
45 | DDRD = DDRD | 0x1c; |
46 | PORTD = (PORTD & 0xe3) | leds; |
47 | _delay_ms(500); |
48 | leds = 0x00; |
49 | DDRD = DDRD | 0x1c; |
50 | PORTD = (PORTD & 0xe3) | leds; |
51 | }
|
52 | |
53 | |
54 | return 0; |
55 | }
|
Was kann man da noch verbessern?
Es gibt doch nahezu unendliche viele Variationen von Seiten, die das UART initailisieren und ein paar Bytes rein-/raushauen. Weshalb nochmals eine neue ?
Du kannst ggf. den Quarz noch gegen einen geeigneteren austauschen. Es gibt sog. Baudratenquarze. Der 8MHz gehört nicht dazu. http://www.mikrocontroller.net/articles/Baudratenquarz bzw. http://www.wormfood.net/avrbaudcalc.php Ansonsten ausprobieren.
> UCSRC = (1<<URSEL)|(3<<UCSZ0);
hast du im Datenblatt nachgeschaut ob es bei dem ATm32 ein "UCSZ0"
-Register gibt?
Gast wrote: >> UCSRC = (1<<URSEL)|(3<<UCSZ0); > > hast du im Datenblatt nachgeschaut ob es bei dem ATm32 ein "UCSZ0" > -Register gibt? Das sind Bits und kein Register! Und ja, beim ATMega32 gibt es die.
Johannes M. (johnny-m) wrote: > Oh, rar, wie schön. Wünsche viel Spaß allein... > Ach, so ist das! Dann mach Deinen Dreck allein! > Das sind Bits und kein Register! Und ja, beim ATMega32 gibt es die. Welche Laus ist dir denn heute über die Leber gelaufen?? Wenn du was zu sagen hast und auf einen Fehler aufmerksam machen willst gewöhn dir einen anderen Ton an oder halt die Schnauze. Und ja, sorry, da habe ich mich vertan mit Bits und Register.
Gast wrote: > Wenn du was zu sagen hast und auf einen Fehler aufmerksam machen willst > gewöhn dir einen anderen Ton an oder halt die Schnauze. Hast Du noch alle? Derjenige, der um Hilfe bittet, soll sich erst mal einen anderen Ton angewöhnen! Und von einem anonymen Gast lasse ich mich sicher nicht so anpflaumen! Thorsten Grube wrote: >> Schön währe es wenn statt meckern auch Hilfe kommt. Ich hatte nämlich oben gar nicht "gemeckert"...
Das sehe ich ja ein. Das Wort "meckern" war keine gute Wahl. Aber nur schreiben was einen nicht gefällt, hilft einen Anfänger auch nicht weiter. Aber wie schon sagst, der Ton macht die Musik. Und der sollte wieder zurück auf die Sachliche Ebene gebracht werden. Alles andere Hilft mir nämlich nicht weiter.
Thorsten Grube wrote: > Das sehe ich ja ein. Das Wort "meckern" war keine gute Wahl. Aber nur > schreiben was einen nicht gefällt, hilft einen Anfänger auch nicht > weiter. Nun, es gab zu dem Zeitpunkt nichts Positives. Es sollte eine Aufforderung sein, das Format des Anhangs zu überdenken. Und wie gesagt: Für ein solches Testprogramm braucht es erst mal nur den Code, weshalb ein Archiv überflüssig ist. Viele denken überhaupt nicht nach, was sie da senden und setzen stillschweigend voraus, dass wohl alle ein Programm auf dem Rechner haben, mit dem sie das öffnen können... > Aber wie schon sagst, der Ton macht die Musik. Und der sollte > wieder zurück auf die Sachliche Ebene gebracht werden. Gute Idee.
Ja, find ich auch. @Thorsten hast du das Programm oben denn jetzt mal getestet und funktioniert es oder welche Problem treten immer noch auf?
So nun klappt das endlich. Nun werde ich mich auch tiefer in die PRogrammierung von dem Prozessor einarbeiten. Für mich war es erst einmal wichtig die einfachen und wesendlichen Dinge zum laufen zu bekommen. Nun kann man sich langsam vorwärts arbeiten. Danke noch einmal an alle Beteiligten.
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.