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


von popi (Gast)


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

von Elektrikser (Gast)


Lesenswert?

Welcher Code?

von popi (Gast)


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

von Michael (Gast)


Lesenswert?

Ist morgen nicht schulfrei ?

von popi (Gast)


Lesenswert?

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

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

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.