mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART - ATMEGA8


Autor: Peter Summer (Gast)
Datum:

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

Autor: Peter Summer (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

Autor: dennis (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Peter Summer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher bekomme ich so ein Terminalprogramm bzw. werden dann Mega und PC
per SPI verbunden?

Mit freundlichen Grüßen

Autor: methyl (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Gaby Lehminger (Gast)
Datum:

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

Autor: Pete da Heat (Gast)
Datum:

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

Autor: Gaby Lehminger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, Danke! Funktioniert jetzt!

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.