www.mikrocontroller.net

Forum: Compiler & IDEs Helft mir bitte jemand mit UART weiterhelfen?


Autor: popi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich muss bis morgen ein kleines Programm schreiben, welches Daten von
der seriellen Schnittstelle auswertet und diese in das EEPROM
schreibt.
Nun habe ich keine Erfahrung mit UART, aber ICH MUSS es hinbekommen...

Deswegen bitte ich Euch, über den folgenden Code mal drüberzuschauen,
habe lt. Datenblatt alle notwendigen Bits gesetzt hoffe ich.

Desweiteren verstehe ich nicht, an welche Stelle ich denn jetzt die
Subroutine hinschreiben soll und wie darauf verwiesen wird, die
ausgeführt werden soll, wenn Daten im Lesepuffer bereitsliegen.

Und die letzte Frage vorerst: wie schreibt man denn Daten in das
EEPROM?
Wenn z.B. eine Bedingung vorliegt, mit welchem Befehl schreibt man denn
von der ersten Adresse des EEPROMS BITWEISE (z.B.LSB) eine "1" rein?
Also sowas wie EEPROM_0x0001 = (1 << 1);

Wenn einer Hilfe braucht, dann jetzt ;o)

Danke schon mal im voraus

Grüße

PS: Controller: mega64 mit AVR-GCC

popi

Autor: Elektrikser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Code?

Autor: popi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry ;o)

hier der nächste Versuch:

<pre>
#include <avr/io.h>
#include <avr/interrupt.h>

/* USART initialisieren */
void uart_init(void);


int main(void)
{
  /* USART initialisieren */
  uart_init();

  sei();

  /* Nichts tun. Die Interrupts erledigten den Rest */
  while (1)
    ;
}

void uart_init(void)
{
  UBRR1L = 0x51;  /* Baudrate einstellen ( Normaler Modus ) */
  UCSR1A = (1 << RXC1); //RX Interrupt erlauben
  UCSR1B = (1 << RXCIE1) | (1 << RXEN1) | (1 << TXEN1); /* Aktivieren
des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
  UCSR1C = (1 << UCSZ10) | (1 << UCSZ11); //8 Datenbits, 1 Stoppbit,
keine Parität
}


SIGNAL(SIG_UART_RECV) /* Interrupt wird ausgelöst sobald neue Daten im
USART-Empfangspuffer liegen */
{
  unsigned char buffer;

  /* Daten aus dem Puffer lesen ... */
  buffer = UDR1;

  /* ... warten bis der Sendepuffer leer ist ... */
  while ( !( UCSR1A & (1<<RXC1)) )
    ;
  /* ... hier in Speicher schreiben */

}
<//pre>

Stammt von einer Internetseite und habe ihn auf die Register des MEga64
angepasst, so hoffe ich zumindnst ;o)
Laut Datenblatt müsste es so stimmen.

Grüße

popi

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist morgen nicht schulfrei ?

Autor: popi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das stimmt, aber Montag früh fertigstellen bei der
Antwortgeschwindigkeit und der Anzahl der nutzbaren Antworten???

nun ja... das wird dann wohl knapp...

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.