Hallo zusammen, ich bin ein totaler Anfänger was MC betrifft. Hab nun doch schon einiges mit Hilfe des Asuros herausgefunden. Nun will ich aber Daten von meinem ATMega32 Testboard von einem ADC Kanal zu meinem PC schicken mittels USART. Nach langen Versuchen immer noch erfolglos. Kann mir vielleicht jemand einen Ansatz zu einem Script geben um dies zu realisierne. Wäre echt froh. MfG. Miklo
Die Basics stehen ausführlich im AVR-GCC-Tutorial auf dieser Seite. Das Tutorial bezieht sich zwar nicht direkt auf den Mega32, aber die Grundfunktionen sind identisch. Für das senden zum PC (RS232) wirst Du nur den asynchronen Betrieb benötigen. Beim Mega16 und Mega32 muss man zusätzlich beachten, dass die Register UBRRH und UCSRC auf der selben Adresse im I/O-Bereich liegen und dass beim Zugriff auf das UCSRC das höchstwertige Bit (URSEL) gesetzt sein muss. Da sind schon einige drüber gestolpert.
Hallo, danke für die schnelle ANtwort. Hab es auch mit dem Tut versucht und folgendes ergebnis erhalten. Jedoch kann ich es nicht kompilieren wegen dem Aufruf denke ich. Warum nicht? #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdlib.h> /* USART-Init beim ATmega16 */ #ifndef F_CPU #define F_CPU 14745600 /* Oszillator-Frequenz in Hz */ #endif // Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt) #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1) #define UART_BAUD_RATE 9600 int main() { UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 ); UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ); while(1); { while (!(USR & (1<<UDRE))); /* warten bis Senden moeglich */ UDR = 'x'; } } Wäre echt froh um kleinen Input MfG Miklo
> Jedoch kann ich es nicht kompilieren wegen dem Aufruf denke ich
Was für ein Aufruf? Da kommt kein einziger Funktionsaufruf in
deinem Programm vor.
Wenn du vom Compiler eine Fehlermeldung kriegst, dann lies sie
auch. Konkret meckert der Compiler rum, dass er USR nicht
kennt.
Das USR Register heist beim Mega32 UCSRA
while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */
Steht aber auch im Tutorial im Abschnitt USART, dass bei
neueren Prozessoren die Register anders heissen.
Du willst wie's aussieht mit 9600 Baud, 8 Datenbits, keine Parität und 1 Stopbit übertragen. Dazu brauchst du das UCSRC - Register gar nicht zu beschreiben. Mit '(3<<UCSZ0)' ('3'?) kann der Compiler wohl auch wenig anfangen. Und probier mal die Baudrate 'von Hand' auszurechnen und das nicht den Präprozessor machen zu lassen. Hatte damit auch schon Probleme.
@Sonic: Warum sollte der Compiler mit (3<<UCSZ0) nix anfangen können? Das ist eine durchaus übliche (wenn auch nicht grad übersichtliche) Schreibweise, wenn zwei direkt hintereinander stehende Bits gesetzt werden sollen (in diesem Fall das UCSZ0 und UCSZ1).
Wer macht denn bitte sowas? Dass es funktioniert mag sein, aber man kann sich das Leben auch mit Gewalt schwer machen! Hab' das hier das erste mal gesehen!
Das taucht hier öfters auf. Wenn Du Dich mal durch die Codesammlung klickst, wirst Du möglicherweise einige Beispiele finden. Ist halt weniger Tipparbeit, wenn man anstelle von "(1 << UCSZ1)|(1 << UCSZ0)" einfach "(3 << UCSZ0)" schreibt. Rauskommen tut dasselbe...
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.