Hi, ich versuche mich in UART einzuarbeiten. Ich bin bisweilen am Bootloader-Beispiel gescheitert: Schritt 3 - Programmieren des Bootloaders Dazu: Habe gerade nen Atmega16 auf dem Pollin-Board. Das hat einen Quarz. Ich habe ein Timerbeispiel genommen, mit einer blinkenden LED, und habe die verdammte LED mit einer Stoppuhr vermessen (Vorteiler 1024, IRQ bei 256 (8 bit Timer), 1 MHz über Fuse eingestellt), funktioniert, das Teil scheint mir erwartungsgemäß mit 1 MHz zu takten, oder halt auf 8MHz, wenn ich die Fuse setze... ich habe auf dem Pollin-Board Jumper 1 und 2 gesteckt, damit TXD und RXD an der RS232 hängen... ich habe mir sogar nebst Putty den Free Serial Monitor installiert, um das besser zu verstehen. Ich bekomme einfach keine Verbindung, ich bräuchte von mir aus auch keinen Bootloader, sondern ein simples Beispiel, mit einer Kommunikation über die serielle Schnittstelle. Sobald ich bei dem Beispiel oben die RS232 oben anstöpsel ist schweigen im Walde. Könnt ihr mir helfen? Danke! Ciao, Jens
Also Dein µC funktioniert? Kannst Du LEDs blinken lassen oder sowas? Ich suche mal nach nem kleinen Code... EDIT: Jo hast ja geschrieben, dass was blinkt... Gruß Steven
im Tutorial steht was einfaches. AVR-GCC-Tutorial/Der UART
1 | #define F_CPU 1000000UL
|
2 | #include <util/delay.h> |
3 | |
4 | #define BAUD 9600UL // Baudrate
|
5 | |
6 | // Berechnungen
|
7 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
8 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
9 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
10 | |
11 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
12 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
13 | #endif
|
14 | |
15 | void uart_init(void) |
16 | {
|
17 | UBRRH = UBRR_VAL >> 8; |
18 | UBRRL = UBRR_VAL & 0xFF; |
19 | |
20 | UCSRB |= (1<<TXEN); // UART TX einschalten |
21 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 |
22 | }
|
23 | |
24 | int main(void){ |
25 | |
26 | uart_init(); |
27 | |
28 | while(1){ |
29 | _delay_ms(1000); |
30 | while (!(UCSRA & (1<<UDRE))); |
31 | UDR = 'x'; |
32 | }
|
33 | |
34 | }
|
Steven () schrieb: > Also Dein µC funktioniert? Kannst Du LEDs blinken lassen oder sowas? > > Ich suche mal nach nem kleinen Code... > > EDIT: Jo hast ja geschrieben, dass was blinkt... > > Gruß Steven Ich habe gerade festgestellt, dass ich über AVR8 Burn-O-Mat den Calibrated INTERNAL Oscillator nutze, aber das Pollin hat ja wohl auch einen 16MHz Quarz dranhängen... aktuell habe ich Hex (H)99 (L)E4 für 8 MHz interne Taktung bei den Fuses... die CKSELx werden ja durch Burn-O-Mat automatisch gesetzt, wenn ich die interne Taktrate setze. Mein mC ist in Ordnung, das oben genannte Beispiel hatte ich auf 0x3800 programmiert, auch das schien mir in Ordnung. Aber echt, ich sch... auf den Bootloader, wenn ich erst einmal ein Beispiel für UART habe, das funktioniert... du hast ja auch das Pollin-Board, wie gesagt, Jumper 1 und 2 habe ich geschlossen, das hatte ich zuerst übersehen... Merci!
moin schöne Erklärung mit Bsp. http://www.avrbeginners.net http://www.avrbeginners.net/architecture/uart/setup_uart.html
Pastor Braune schrieb: > moin > > schöne Erklärung mit Bsp. > http://www.avrbeginners.net > http://www.avrbeginners.net/architecture/uart/setup_uart.html Okay, sorry, aber ich möchte auf C coden, hätte ich vielleicht explizit schreiben müssen.
Also ich programmier schon seit mehreren Jahren die Atmel Mikrocontroller und ich muss leise gestehen, dass ich noch nie einen Bootloader programmiert habe. Auch keine Makefile... psst. verrats nicht weiter. :) Gruß Steven
Steven () schrieb: > Also ich programmier schon seit mehreren Jahren die Atmel > Mikrocontroller und ich muss leise gestehen, dass ich noch nie einen > Bootloader programmiert habe. Auch keine Makefile... > > psst. verrats nicht weiter. :) > > Gruß Steven Lol, kein Ding, ich will das auch nicht programmieren, aber vermutlich nutzen! ;) Bin schweigsam wie Twitter ;) Ich würde gerne UART verstehen und nutzen. Echt, der Bootloader ist mir gerade schon wurscht, ich möchte eigentlich primär einfach mit der seriellen Schnittstelle arbeiten. Du siehst meine Verzweiflung, wenn ich mit ner Handy-Stoppuhr eine Leuchtdiode vermesse... (auch nicht weitererzählen bitte ;) )
Was genau meinst Du mit verstehen und nutzen? Mir ist womöglich nicht bewusst was ich noch nicht weis. UART ist ja einfach ein serielles Protokoll, welches mit dem µC entweder per Hardware oder Software genutzt werden kann. Die Baudrate ist bekanntlich die Anzahl der Zeichen pro Sekunde. Und das wars ja auch schon fast. 5 bis 9 Datenbits, ein Stopbits mit 1, 1,5 oder 2 Bitlänge (wenn ichs noch richtig weis) und Paritätsbit (1 oder 2?) Gruß Steven
Ich will einfach lernen, seriell zu kommunizieren. Dafür hätte ich gerne ein funktionsfähiges schönes Beispiel, denn mir hilft das halt, wenn auch etwas passiert... ich möchte das, aktuelle Idee, als Kommunikationsprotokoll zwischen mehreren mCs zu benutzen. Aber egal! Ich will echt momenten nur, dass der Mist hier funktioniert, irgendein Beispiel. Grüße, Jens
Hi >Ich will echt momenten nur, dass der Mist hier funktioniert, >irgendein Beispiel. Ein Beispiel steht sogar im Datenblatt. MfG Spess
Spess53 schrieb: > Hi > >>Ich will echt momenten nur, dass der Mist hier funktioniert, >>irgendein Beispiel. > > Ein Beispiel steht sogar im Datenblatt. > > MfG Spess Hi Spess, sieht mir doch eher nach Codefragmenten aus. Ich würde halt gerne mit einem Beispiel anfangen, dass zusammenhängend ist... vielleicht übersehe ich da was. Mir reicht irgendein Hallo-Welt-Zeugs in C, das dann auch funktioniert. Vielleicht brauche ich ja mehr Zeit etc., aber ich bin gerade etwas ungeduldig, weil ich doch einfach nur funktionsfähigen C-Code möchte. Ciao, Jens
@J. W. Was eigentlich stört dich an dem praktisch vollständigen, von Steven geposteten, Bleistift. Das der Hintergrund die falsche Farbe hat?
Hi > aber ich bin >gerade etwas ungeduldig, weil ich doch einfach nur funktionsfähigen >C-Code möchte. Funktionsfähigen Code bekommt man einfach durch Lesen und Verstehen des Datenblatts. So habe ich es und tausende andere AVR-Benutzer auch gemacht. Was nutzt dir irgend ein Code, den du nicht verstehst? Wenn du das nicht in die Reihe bekommst hast du möglicherweise das falsche Hobby. MfG Spess
Spess53 schrieb: > > Funktionsfähigen Code bekommt man einfach durch Lesen und Verstehen des > Datenblatts. So habe ich es und tausende andere AVR-Benutzer auch > gemacht. > > Was nutzt dir irgend ein Code, den du nicht verstehst? > > Wenn du das nicht in die Reihe bekommst hast du möglicherweise das > falsche Hobby. > > MfG Spess Danke, vielmals, habe mich lieber selbst auf die Suche gemacht - und wurde fündig. Hier funktionsfähiger Code, der sofort Lernerfolg bringt, aber daran bist Du im Vermitteln anscheinend nicht interessiert. Ich habe den nur kurz angepasst auf PortA. Vielen Dank. /* * UART02.c * * Created: 24.04.2013 23:03:35 * Author: jens */ #define F_CPU 8000000UL // 8 MHz /*Very Important - change F_CPU to match target clock Note: default AVR CLKSEL is 1MHz internal RC This program transmits continously on USART. Interrupt is used for Receive charactor, which is then transmitted instead. LEDs are used as a test. RX routine is included but not used. Change USART_BAUDRATE constant to change Baud Rate */ #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> // Define baud rate #define USART_BAUDRATE 38400 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) volatile unsigned char value; /* This variable is volatile so both main and RX interrupt can use it. It could also be a uint8_t type */ /* Interrupt Service Routine for Receive Complete NOTE: vector name changes with different AVRs see Help - AVR-Libc reference - Library Reference - <avr/interrupt.h>: Interrupts for vector names other than USART_RXC_vect for ATmega32 */ ISR(USART_RXC_vect){ value = UDR; //read UART register into value PORTA = ~value; // output inverted value on LEDs (0=on) } void USART_Init(void){ // Set baud rate UBRRL = BAUD_PRESCALE;// Load lower 8-bits into the low byte of the UBRR register UBRRH = (BAUD_PRESCALE >> 8); /* Load upper 8-bits into the high byte of the UBRR register Default frame format is 8 data bits, no parity, 1 stop bit to change use UCSRC*/ // Enable receiver and transmitter and receive complete interrupt UCSRB = ((1<<TXEN)|(1<<RXEN) | (1<<RXCIE)); } void USART_SendByte(uint8_t u8Data){ // Wait until last byte has been transmitted while((UCSRA &(1<<UDRE)) == 0); // Transmit data UDR = u8Data; } // not being used but here for completeness // Wait until a byte has been received and return received data uint8_t USART_ReceiveByte(){ while((UCSRA &(1<<RXC)) == 0); return UDR; } void Led_init(void){ //outputs, all off DDRA =0xFF; PORTA = 0x00; } int main(void){ USART_Init(); // Initialise USART sei(); // enable all interrupts Led_init(); // init LEDs for testing value = 'A'; //0x41; PORTA = ~value; // 0 = LED on for(;;){ // Repeat indefinitely USART_SendByte(value); // send value _delay_ms(250); // delay just to stop Hyperterminal screen cluttering up } }
Hi >Hier funktionsfähiger Code, der sofort Lernerfolg bringt, Welchen Lernerfolg? Wohl das du Copy & Paste gelernt hast. >aber daran bist Du im Vermitteln anscheinend nicht interessiert. Ich >habe den nur kurz angepasst auf PortA. Vielen Dank. Ich bin notorischer Assembler-Programmierer. Meinst du, das ich dir das hätte vermitteln können oder das du an meiner Lösung interessiert wärst? MfG Spess
Spess53 schrieb: >>Hier funktionsfähiger Code, der sofort Lernerfolg bringt, > > Welchen Lernerfolg? Wohl das du Copy & Paste gelernt hast. > Nein, das ich FUNKTIONSFÄHIGES Beispiel habe, und verstehen kann, WARUM das nun funktioniert. >>aber daran bist Du im Vermitteln anscheinend nicht interessiert. Ich >>habe den nur kurz angepasst auf PortA. Vielen Dank. > > Ich bin notorischer Assembler-Programmierer. Meinst du, das ich dir das > hätte vermitteln können oder das du an meiner Lösung interessiert wärst? > Spess, ich werde vielleicht auch noch Assembler programmieren, wer weiß, dann währe ich für Deine Hilfe dankbar! Aber auf Sprüche wie "Wenn du das nicht in die Reihe bekommst hast du möglicherweise das falsche Hobby." kann ich nun wirklich dauerhaft verzichten, egal, was ich mache, welche Sprache etc. Das ist meine Entscheidung. Ob Du mir dann noch helfen möchtest, dass ist deine Entscheidung. > MfG Spess Grüße, Jens
Ist ja noch einiges geschrieben worden gestern. Also Jens, scheinbar hast Du ja jetzt selbst ein Code gefunden. Wenn ich das jetzt richtig sehe war der Thread und mein Codebeispiel mehr oder weniger unnötig. Vielleicht kannst Du ja beim nächsten Mal einfach mal etwas mehr Geduld aufbringen und dann was Posten. Oder wenn Du ne konkrete Frage hast. Codefragmente kann man eigentlich selbst suchen... Funktionierts denn jetzt und hast Du deinen Lernerfolg schon hinter Dir? Mir ist übrigends beim Überfliegen aufgefallen, dass value nicht definiert ist. Gruß Steven
Steven () schrieb: > Ist ja noch einiges geschrieben worden gestern. > > Also Jens, scheinbar hast Du ja jetzt selbst ein Code gefunden. > Wenn ich das jetzt richtig sehe war der Thread und mein Codebeispiel > mehr oder weniger unnötig. Nein, überhaupt nicht, vielen Dank! Bei mir war das compilieren gleich ausgestiegen, wegen dem error im DEFINE. Da war ich genervt nach ein paar Abenden misslungenen Bootloader-Versuchen. Das Beispiel, dass ich fand, hat sofort funktioniert, ich brauche halt ab und zu ein sichtbares Erfolgserlebnis, insofern auch sorry an Spess. > > Vielleicht kannst Du ja beim nächsten Mal einfach mal etwas mehr Geduld > aufbringen und dann was Posten. Oder wenn Du ne konkrete Frage hast. > Codefragmente kann man eigentlich selbst suchen... Ja Steven, ich denke halt, dass der umgekehrte Weg mir mehr hilft. Endlich funktioniert etwas, aber WARUM funktioniert es? Denn jetzt habe ich Dein Beispiel auch zum laufen gebracht. > > Funktionierts denn jetzt und hast Du deinen Lernerfolg schon hinter Dir? > Da hakt es ganz gewaltig! Ich bekomme das Beispiel nämlich nur zum laufen, wenn ich (erwartungsgemäß) den Takt auf 8000000UL setze, aber ich muss 38400UL für BAUD setzen... dann bekomme ich viele x über die Putty... ansonsten geht es halt bisher nicht... > Mir ist übrigends beim Überfliegen aufgefallen, dass value nicht > definiert ist. > Wie meinst Du das? Ist doch volatile unsigned char value; ? Danke für Deine und die Hilfe anderer, war echt nicht so gemeint, dass ich das nicht als Hilfe empfinde. Viele Grüße, Jens
Steven () schrieb: > > Vielleicht kannst Du ja beim nächsten Mal einfach mal etwas mehr Geduld > aufbringen und dann was Posten. Oder wenn Du ne konkrete Frage hast. > Codefragmente kann man eigentlich selbst suchen... > Ich werde noch narrisch, ich habe den Rechner auf http://www.gjlay.de/helferlein/avr-uart-rechner.html genommen, bei 9600 BAUD sollte es keine Probleme geben, und ich habe Dein Beispiel genommen, es geht auch... keine Ahnung was da schief lief...
Hoppla hab die Definition von value überlesen. Ok, dann hab ich das wohl falsch aufgefasst. Ich kann verstehen, dass Du da etwas in Rage bist, wenns nicht klappt. J. W. schrieb: > Da hakt es ganz gewaltig! Ich bekomme das Beispiel nämlich nur zum > laufen, wenn ich (erwartungsgemäß) den Takt auf 8000000UL setze, aber > ich muss 38400UL für BAUD setzen... dann bekomme ich viele x über die > Putty... ansonsten geht es halt bisher nicht... Mhm. Ist das CLK/8 Flag entsprechend gesetzt? Lad halt mal den Code im Anhang hoch. Ich hatte letztens übrigends Probleme mit dem Umstellen des Taktes, an was es genau lag kann ich aber auch noch nicht sagen. Er ließ sich aber schlecht umstellen mittels F_CPU Umdefinition. Was ich damit sagen will ist nur, dass es sein kann dass die Frequenz beim Umdefinieren evtl. nicht gleich stimmt. Das soll jetzt aber nur ein kleiner Tipp sein, genaueres weis ich auch noch nicht. Stelle also am besten erst sicher, dass eine LED die mit _delay_ms(1000) blinkt auch wirklich 1sec blinkt... Gruß Steven
J. W. schrieb: > Ich werde noch narrisch, ich habe den Rechner auf > http://www.gjlay.de/helferlein/avr-uart-rechner.html genommen, bei 9600 > BAUD sollte es keine Probleme geben, und ich habe Dein Beispiel > genommen, es geht auch... keine Ahnung was da schief lief... Ja ich glaube das hängt mit der Umdefinition von F_CPU zusammen... Aber vielliecht kennt ja jemand eine bessere Antwort.
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.