mikrocontroller.net

Forum: Compiler & IDEs ATMega32 USART


Autor: Manuel Miklo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manuel Miklo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.