Forum: Compiler & IDEs ATMega32 USART


von Manuel Miklo (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Manuel Miklo (Gast)


Lesenswert?

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

von Karl heinz B. (kbucheg)


Lesenswert?

> 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.

von Sonic (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

@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).

von Sonic (Gast)


Lesenswert?

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!

von johnny.m (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.