www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik mega128: rtc + usart

Autor: tommi (Gast)
Datum:

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:

hallo,

schicke uns doch mal bitte deine inti-Routinen.

Hast du die Interrupts wärend der Übertragung vom USART ausgeschaltet?
Autor: lightninglord (Gast)
Datum:

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:

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:

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:

***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:

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:

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:

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:

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:

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net