Hallo, Ich versuche jetzt schon ewig eine serielle Datenübertragung zwischen 2 ATMEGA 8 zu programmieren, es will jedoch nicht funktionieren. Hier meine beiden Codes. Vielleicht kann mir jemand sagen was ich falsch mache. (Quarz: 14,7456MHz) Transmitter:_________________________________________________________ #include<stdio.h> #include <mega8.h> #include<delay.h> void init (); char i=0; char werte[6] = {0x20,0x10,0x08,0x04,0x02,0x01}; //====================================================================== =========================== // Hauptprogramm void main () { init(); UDR=0x00; UCSRA = UCSRA & 0xBF; while (1) { } }//main //====================================================================== =========================== void init () { DDRD=0x00; DDRC=0xFF; DDRB=0x00; UCSRA=0x00; UCSRB=0x48; //Transmitter enable UCSRC=0x86; // UBRRH=0x00; //Baudrateneinstellung UBRRL=0x03; //Baudrateneinstellung (UBRRL&UBRRH ergibt eine Baudrate von 230400 BAUD) SREG=0x80; //Global Interrupt Flag = 1 GICR|=0x00; //Initialisierung externe Interrupts MCUCR=0x00; //Initialisierung externe Interrupts }//void //====================================================================== =========================== interrupt [USART_TXC] void Transmit(void) { delay_ms(100); UDR = werte[i]; i++; if (i<=5) { i=0; } UCSRA = UCSRA & 0xBF; } Receiver:________________________________________________________ #include<stdio.h> #include <mega8.h> #include<delay.h> #define LED PORTD void init (); unsigned char wert=0; //====================================================================== =========================== // Hauptprogramm void main () { init(); while (1) { LED=wert; } }//main //====================================================================== =========================== void init () { DDRD=0x00; DDRC=0xFF; DDRB=0x00; UCSRA=0x00; UCSRB=0x90; //Transmitter enable UCSRC=0x86; // UBRRH=0x00; //Baudrateneinstellung UBRRL=0x03; //Baudrateneinstellung (UBRRL&UBRRH ergibt eine Baudrate von 230400 BAUD) SREG=0x80; //Global Interrupt Flag = 1 GICR|=0x00; //Initialisierung externe Interrupts MCUCR=0x00; //Initialisierung externe Interrupts }//void //====================================================================== =========================== interrupt [USART_RXC] void Receive(void) { wert=UDR; UCSRA = UCSRA & 0x7F; }
Ich hab noch etwas vergessen: Ich will mit dem Programm nur von einem µC Hexzahlen, die in einem array stehen, übertragen und am anderen µC auf LEDs (PORTD) ausgeben. Gruss Peter
Dir fehlt auf jedenfall schon mal die folgende Zeile: #include <avr/interrupt.h> Wenn Du ein Oszilloskop besitzt, schaue dir doch mal den TX-Pin deines Transmitters an. Dann kannst Du schon mal die Fehlerquelle eingrenzen......
reusper ich glaub mit dem include kommt er auch nicht weiter. Das sieht nicht nach AVR-GCC aus, stimmts? Einen 100ms Delay in einer IRQ Routine? Böse, böse. 230400 Baud? Wozu? Nimmer erstmal 9600 um überhaupt mal testen zu können. Kann ja sein das die Tolleranzen der Quarze so weit auseinander liegen das es nicht klappt. Ob die Hex Werte stimmen will ich so nicht prüfen. Ist zu umständlich das rauszufischen welche Bits gesetzt werden. Und was soll das bewirken? GICR|=0x00; Und warum gleich mit IRQ? Probier's doch erstmal ohne
Und wenn ich auch noch meinen Senf dazugeben darf. Schalte erstmal eine moegliche Fehlerquelle aus und versuch nur vom Sender zu Deinem PC zu senden. Auf dem PC laueft ein Terminalprogram von dem man annehmen kann, dass es soweit fehlerfrei ist, dass es Zeichen korrekt empfangen kann. Klappt das irgendwann, kannst Du davon ausgehen dass Deine Sendefunktion einigermassen richtig ist und erst dann beschaeftigst Du dich mit der Empfangsfunktion am anderen Mega. So ist das alles kein Stochern im Nebel mehr, weil Du zumindest immer weist ob Du nun den Fehler beim Sender oder beim Empfaenger suchen musst.
Woher bekomme ich so ein Terminalprogramm bzw. werden dann Mega und PC per SPI verbunden? Mit freundlichen Grüßen
statt >if (i<=5) >{ >i=0; >} müsste wohl eher "if (i>=5)" heissen. Sonst überträgt er dir ständig nur 0x20. Vielleicht mußt du deine Variable "wert" bzw "werte" als volatile deklarieren.
> Woher bekomme ich so ein Terminalprogramm bzw. werden dann Mega > und PC per SPI verbunden? Wenn Du Windows benutzt, dann hast Du das bereits auf der Maschine. Nennt sich 'Hyperterminal' und findet sich normalerweise im Startmenue unter 'Zubehoer' (irgendwo da drunter). Wieso SPI? Ich dachte Du benutzt den USART, also eine stinknormale RS232 Verbindung? OK. Diese Annahme ist vielleicht von meiner Seite etwas gewagt gewesen.
Hallo, ich versuche eine Schnittstelle zum PC (VB6.0-Programm) herzustellen. Kann mir vielleicht jemand sagen auf was ich UBRRH und UBRRL setzen muss, bei 1MHz und 9600? Vielen Dank schonmal! Gaby
@Gaby Ich schätze Du verwendest auch einen Mega8? laut Datenblatt S.156 7% Fehler, also unbrauchbar. Entweder Du nimmst einen anderen Quarz oder setzt das U2X-Bit in UCSRA, was allerdings Deine Übrtragungsgeschwindigkeit verdoppelt. Nimm einen anderen Quarz. Falls Du eh den internen 1Mhz-Oszi meinst, funktioniert's eh nicht, da der zu ungenau ist, Du wirst eh einen externen brauchen. Viel Spaß noch! Pete
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.