mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega324P serielle Schnittstelle möchte nicht


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte mit einem ATMega324P testweise einfach nur kontinuierlich ein 
Zeichen an meinen PC senden. Es ist zusätzlich ein externer Quarz mit 
14,7456MHz verbaut, ebenso ein MAX3232 um den Pegel für die Übertragung 
zu verstärken.
Nach etlichen Versuchen hab ich es leider nicht hinbekommen. 
Einstellungen sollten soweit korrekt sein. Möglicherweise kann mir hier 
ja jemand helfen und mir den/die Fehler nennen. Die blinkende LED am 
Programmende soll nur dazu dienen, um zu sehen, ob das Programm richtig 
drauf ist. :) Bin leider ein ziemlicher Anfänger, was die Programmierung 
der Atmels angeht.. Hier ist mein Code:

#include <avr/io.h>
#include<stdlib.h>
#include<stdio.h>
#include<util/delay.h>
#include <string.h>

#define LED PA2
#define set_bit(byte,bit) (byte) |= (1<<(bit))
#define clear_bit(byte,bit) (byte) &= ~(1<<(bit))

#ifndef F_CPU
#define F_CPU 14745600UL //CPU Frequency Hz
#endif
#define UART_BAUD_RATE 9600 //kHz
// Hilfsmakro zur UBRR-Berechnung 
#define UART_UBRR_CALC(UART_BAUD_RATE,F_CPU) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)


int main( void )
{
blink();
  /* Set baud rate */
  UBRR0H = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
  UBRR0L = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
  
  /* Enable receiver and transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  
  /* Set frame format: 8data, 2stop bit */
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
  
  UCSR0A = (0<<U2X0);

  unsigned char zeichen = 't';

  while (1)
  {
    _delay_ms(50);
    //warten bis letztes Zeichen gesendet
    UDR0 = zeichen;
    loop_until_bit_is_set(UCSR0A, UDRE0);
    
  }
  
  return 0;
}



/* Blinkende LED an Pin PA2 */


void blink()
{
  set_bit(DDRA,LED);
  while(1)
  {
    set_bit(PORTA,LED);
    _delay_ms(200);
    clear_bit(PORTA,LED);
    _delay_ms(200);
  }
}


Vielen Dank!!

Gruß,
Sebastian

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die blinkende LED am
>Programmende soll nur dazu dienen, um zu sehen, ob das Programm richtig
>drauf ist. :)

Aus dem Funktionsaufruf blink() am Programmanfang kehrt das Programm 
aber nie mehr zurück ;-)

Der Rest danach wird nie ausgeführt.

Oliver

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, stimmt.. ändert aber nix an der Funktion. Geht auch nicht, wenn ich 
den Teil rausnehme.

Autor: seven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- blink() steht unter main
- blink is ne endlosschleife ?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blink ist erstmal völlig egal, das habe ich bereits komplett entfernt. 
Der Rest funktioniert aber nach wie vor nicht.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du denn schon geprüft, ob die Harware OK ist (Echotest bei 
verbundenem RxD/TxD am µC-Sockel)?

Was genau bedeutet "geht nicht"?  Hast Du mit dem Oszi am TxD-Pin 
geprüft, dass sich da nichts tut?

Kein Grund, überhaupt nicht zu funktionieren, aber eine Bemerkung:
    UDR0 = zeichen;
    loop_until_bit_is_set(UCSR0A, UDRE0);
Diese Zeilen sollten vertauscht werden.  Das Programm kann was Anderes 
tun, während ein Zeichen gesendet wird, statt dumpf zu warten, bis es 
akzeptiert ist.  Und von der Logik her ist es auch besser so: erst wenn 
UDREx gesetzt ist, darf nach UDR geschrieben werden (was in Deinem Fall 
aber auch so gewährleistet ist).

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch Sachen zum checken:

Der externe Quarz ist auch in den Fuses gesetzt? -> wär gut
Ist CKDIV8 gesetzt (teilt im Controller den Takt durch 8)? -> wär 
schlecht
Ist der Baudratenfehler kleiner 1%?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier einfach mal ein funktionierendes Beispiel:

Beitrag "AVR-GCC: UART mit FIFO"


Peter

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
danke schonmal für die vielen Antworten.
Einen Oszi hab ich hier zuhaus leider nicht. Ich werds morgen mal im 
Labor messen, wenns geht.
Baudratenfehler ist kleiner als 1%, wo finde ich das, ob der externe 
Quarz gesetzt ist?
Zu dem "funktionierenden" Beispiel: habs versucht, da fehlen Bezüge.. 
warum auch immer, der scheint die main.h und uarto.h nicht zu finden 
(obwohl die da sind). Kommt ne Fehlermeldung a la main.c:22: undefined 
reference to `init_uart0'... und noch einige mehr dieser Art. Die sind 
ja eigentlich in der headerdatei deklariert..

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in die AVR Checkliste, gleich der zweite Punkt. Da wird 
beschrieben, welche Fuses du setzen musst.

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR Checkliste meinte ich

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Zu dem "funktionierenden" Beispiel: habs versucht, da fehlen Bezüge..
> warum auch immer, der scheint die main.h und uarto.h nicht zu finden
> (obwohl die da sind). Kommt ne Fehlermeldung a la main.c:22: undefined
> reference to `init_uart0'... und noch einige mehr dieser Art.

Wie lautet die erste Warn-/Fehlermeldung exakt?

Welche Toolchain/OS benutzt Du?

Unter Unix kann die Großschreibung ein Problem sein.
Nenne mal alle Files in klein um.


Peter

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
danke schonmal für den Tip mit den Fuses. Da ist bei mir folgendes 
Eingestellt (nach Auslesen angezeigt):

BODLEVEL: Brown-Out detection disabled
OCDEN: disabled
JTAGEN: disabled
SPIEN: enabled
WDTON: disabled
EESAVE: enabled
BOOTSZ: Bootflash size=2048 words start address=$3800
BOOTRST: disabled
CKDIV8: disabled
CKOUT: disabled
SUT_CKSEL: ext. Crystal Osc. 8.0-   MHz startup time: 16K CK +65ms


sollte der CKSEL nicht einfach nur auf ext. clock stehen? z.b. ext. 
clock start-up time 6CK + 0ms?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sollte der CKSEL nicht einfach nur auf ext. clock stehen? z.b. ext.
> clock start-up time 6CK + 0ms?

Esterner Clock ist nicht geeignet, wenn Du einen Quarz angeschlossen 
hast.  Und mit der höheren Startup Time gibst Du dem Anschwingen mehr 
Zeit, bis der Oszillator stabil sein muss.  Weniger würde wohl auch 
gehen, aber ich sehe nicht, dass Du das brauchst.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
so, ich war grad mal im Labor und hab alles durchgemessen. Fehler 
gefunden. Der MAX3232 hat keinen Saft bekommen.. das war das ganze 
Problem. Nun läufts (vorerst) so, wie es soll.

Nochmals vielen Dank an alle!!

Gruß,
Sebastian

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.