Forum: Mikrocontroller und Digitale Elektronik mega128: rtc + usart


von tommi (Gast)


Lesenswert?

Hallo Leute,
ich habe folgende Probleme und zwar. Ich vesuche ein Testprogramm zu 
schreiben. Wenn ein Interrupt kommt, soll der RTC aktivieren und bei 
jeder Sekunde ein Ausgabe per USART erfolgen. Die Code sind folgende:

#include <avr/io.h>
#include "quarz.h"
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "usart_128.h"

volatile uint8_t flag = 0x00;

void timer0_aktivieren (void)
{
  ASSR |= (1 << AS0);

  TCCR0 |= (1 << CS02) | (1 << CS00);
  TIMSK |= (1 << TOIE0);
}

ISR (TIMER0_OVF_vect)
{
  USART_Transmit_String1 ("tick\n\r");
}

ISR (INT1_vect)
{
  timer0_aktivieren ();
}

int main (void)
{
  USART_Init1 ();
  MCUCR |= (1 << SE) | (1 << SM1) | (1 << SM0);
  EIMSK |= (1 << INT1);
  EICRA |= (1 << ISC11);
  sei ();
  while (1)
  {sleep_mode ();}
  return 0;
}

Die USART-Funktion habe ich schon getestet und einwandfrei funktioniert. 
Aber nachdem ich die RTC-Funktion eingebaut habe. Die Ausgabe 
funktioniert nicht mehr richtig. Statt "tick\n\r" auszugeben, gibt sie 
irgendwas anderes aus.

Kann jemand mir bitte sagen, was ich flasch gemacht habe?

Tommi

von lightninglord (Gast)


Lesenswert?

hallo,

schicke uns doch mal bitte deine inti-Routinen.

Hast du die Interrupts wärend der Übertragung vom USART ausgeschaltet?

von lightninglord (Gast)


Lesenswert?

sorry für den Doppelpost, ahb aber noch was entdeckt:

dein sleepmode ist nicht initialisert, es kann sein das dein µC nach nem 
Irq wieder nach Reset springt, hatte das selbe Problem, die 
mitgelieferte sleep-lib unterstützt bisher nur das irq-rst-model, den 
reine irq-mode wie du ihn braust musste selbst initialisieren, oder nim 
diese Lib:

http://www.mtcnet.net/~henryvm/wdt/

von Peter D. (peda)


Lesenswert?

tommi schrieb:
>   MCUCR |= (1 << SE) | (1 << SM1) | (1 << SM0);
...
>   {sleep_mode ();}

Wie soll denn die UART senden, wenn Du ihr immer wieder den Takt 
abschaltest?

UART geht nur im Idle-Mode weiter!


Peter

von Tommi (Gast)


Lesenswert?

Die Initialisierung von USART sind folgende

#define F_CPU 1843200UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

void USART_Init1 (void) // usart1 initialisieren
{
  uint8_t ubrr = MYUBRR;

  UBRR1H = (unsigned char) (ubrr >> 8);
  UBRR1L = (unsigned char) ubrr;

  UCSR1B = (1 << RXEN1) | (1 << TXEN1);
}

und mit der Frage

***Hast du die Interrupts wärend der Übertragung vom USART 
ausgeschaltet?***

Die beiden Interrupt wurden nicht ausgeschaltet. Da die Aufwecksignal 
fuer Int1 nur 1-Mal auftreten zum Aktivieren von timer0 und der 
Intervall von Overflow dauert eine Sekunde.

Tommi

von Tommi (Gast)


Lesenswert?

***die mitgelieferte sleep-lib unterstützt bisher nur das irq-rst-model, 
den
reine irq-mode wie du ihn braust musste selbst initialisieren***

Kannst du mir noch bitte mehr erklären, was du mit dem 
***irq-rst-model*** meinst? und wie kann ich die irq-mode selbst 
initialisieren?

Tommi

von Tommi (Gast)


Lesenswert?

Hallo Peter,
Es soll nämlich wie folgenden funktioniert:

Als Erstes soll der µC sofort in power-save-modus gehen.

Dann wenn am Int1 eine fallende Flanke eintrifft, soll der timer0 
aktivieren.

Danach mit jedem Overflow-Int soll der µC aufwecken, Zeichenkette 
ausgeben und dann wieder im power-save-modus gehen bis der nächsten 
Overflowinterrupt eintrifft.

Tommi

von Peter D. (peda)


Lesenswert?

Was sollen denn diese zerstreuten Schnipselchen?
Zerreist Du auch immer erst Bücher, ehe Du sie jemand anderem zum Lesen 
gibst?
Wozu denkst Du, ist der Dateianhang da?

Warum ist es denn immer so unsäglich schwer, zur Abwechslung mal
nen relevanten und compilierbaren Code zu posten?


[Glaskugelmodus an]
Deine geheimnisvolle "USART_Transmit_String1" wartet nicht, bis das 
letzte Stopbit raus ist und deshalb klaut das Sleep der UART den Takt 
unterm Arsch weg.


Peter

von Tommi (Gast)


Lesenswert?

Hi noch mal,
tut mir leid, wenn mein Post dich so sehr stört. Ich habe nicht die 
Absicht dich zu irren. Ich bin mir sicher, dass meine USART funktion gut 
funktioniert und habe auch getestet. Dewegen wollte ich ja nicht meine 
ganze Code reinschreiben. Na ja wenn du willt. Hier noch die 
USART-Funktionen

#define F_CPU 1843200UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

void USART_Init1 (void) // usart1 initialisieren
{
  uint8_t ubrr = MYUBRR;
  UBRR1H = (unsigned char) (ubrr >> 8);
  UBRR1L = (unsigned char) ubrr;
  UCSR1B = (1 << RXEN1) | (1 << TXEN1);
}


void USART_Transmit1 (char data) // zeichen senden
{  while (! (UCSR1A & (1 << UDRE1)))
    ;
  UDR1 = data;
}

void USART_Transmit_String1 (char *string) // zeichenkette senden
{  while (*string)
    USART_Transmit1 (*string++);
}

unsigned char USART_Receive1 (void) // zeichen empfangen
{  while (! (UCSR1A & (1 << RXC1)))
    ;
  return UDR1;
}

Tommi

von Tommi (Gast)


Lesenswert?

Oh und als weiteres
Das Problem ist: Statt "tick\n\r" raus zu geben. Gib der µC ein völliges 
anderes Zeichen (bei jeder Ausgabe 3 Zeichen, Jedes Mal gleich) aus aber 
mit dem richtigen Intervall zwar 1 sekunde.
Tommi

von spess53 (Gast)


Lesenswert?

Hi

Nur mal so: Wenn du eine Aktion nach dem Senden eines Zeichens 
ausführen willst, musst du TXC und nicht UDRC prüfen.

MfG Spess

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.