www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega128: rtc + usart


Autor: tommi (Gast)
Datum:

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

Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

schicke uns doch mal bitte deine inti-Routinen.

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

Autor: lightninglord (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Tommi (Gast)
Datum:

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

Autor: Tommi (Gast)
Datum:

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

Autor: Tommi (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Tommi (Gast)
Datum:

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

Autor: Tommi (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

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.