mega128: rtc + usart

Gast #1321367
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
Gast #1321405
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/
Gast #1321595
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
Gast #1321603
***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
Gast #1321608
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
#1321649
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
Gast #1321680
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
Gast #1321684
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.