www.mikrocontroller.net

Forum: Compiler & IDEs Programm funktioniert nicht


Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe folgenden Code mit der ich eine LED blinken lassen möchte 
(Attiny2313 - 8MHz). Leider blinkt die LED an dem Port nicht in dem 
gewollen Takt von 1Hz. Derzeit ist die LED etwa 12sec an und 40sec aus. 
Ich finde den Fehler nicht.

#include <avr/io.h>
#include <avr/interrupt.h>


volatile int Impuls;

ISR(TIMER0_OVF_vect)
{
  Impuls++;
}

int main (void)
{
DDRB = 0x0F; //Bit1-4 Eingang und 5-8 Ausgang
PORTB = 0x00; //Pullups deaktivieren und Ausgänge = 0


TCCR0B |= (1 << CS02) | (1 << CS00); //Prescaler auf 1024 stellen
  TIMSK  |= (1 << TOIE0);              // Timer 0 Overflow Interrupt ena


while(1) {

sei();

  if (Impuls==31)
  {
    PORTB= PINB ^ (1<<PB0);
    Impuls = 0;
  }


cli();
}
return (1);

}

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal aus dem "if (Impuls==31)" ein "if (Impuls >= 31)".

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mach mal aus dem "if (Impuls==31)" ein "if (Impuls >= 31)
das ist egal, weil dafür die schleife schnell genug ist.

aber das hier kommt mir nicht sauber vor

> PORTB= PINB ^ (1<<PB0);
warum PINB? damit verwendest du ja einen Eingang - ist das gewollt oder 
ist es von mir ein denkfehler?

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

habe beides ausprobiert jedoch ohne Erfolg. Ob ich PINB oder PORTB zum 
einlesen verwende dürfte eigentlich keinen Unterschied ergeben.

Die Funktion ist in etwa vorhanden. Die LED geht an (ca. 20sec) und aus 
( ca. 7,8sec).

Warum die Unterschiedlichen Zeiten? Zudem sollte es sich um 1HZ handeln. 
Warum passt die Zeit nicht?

ATTiny mit internen 8MHz Quarz --> mit Prescaler 1024 = 0,128ms/zyk.

Ich zähle den Counter 1 bis 256 woraus sich ergibt:

0,128ms/zyk * 256 = 0,033 Bei 1Hz die ich haben will ergibt das etwa 31 
Impulse die ich zählen muss.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum nimmt du nicht einfach den Simulator und gehst es mal im 
einzelschritt durch?

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

welchen Simulator? Bin noch recht unerfahrne in Sachen Programmieren...

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
verwende zum programmieren den WinAVR.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Port PB0 toggeln?
Dann stell ihm mal auf Ausgang, sonst toggelst du nur den Pull-UP

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst Du mir nen Tipp geben wie?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und es ist sicher, daß der Controller mit dem gewünschten Takt läuft? 
Nur weil Du einen entsprechenden Quarz anschließt und das #define im 
Compiler so setzt, heißt das noch nicht, daß der auch mit dieser 
Frequenz läuft. Das muss mit den sogenannten fuses konfiguriert 
werden. Hast Du das gemacht?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo schrieb:
> Kannst Du mir nen Tipp geben wie?

Schon mal das Tutorial angesehen (links oben)?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum dauernd (und zudem an der falschen Stelle) mit den Interrupts 
herumbasteln?

  sei();

  if (Impuls==31)
  {
    PORTB= PINB ^ (1<<PB0);
    Impuls = 0;
  }

  cli();
Du hast ein Semaphorenproblem:
Wie wird der Integer (Impuls) auf 0 setzt? Erst wird ein Byte auf 0 
gesetzt, dann (...) das andere.
Was, wenn jetzt bei den (...) ein Interrupt kommt?

Probiers mal so:
  if (Impuls==31)
  {
    PORTB= PINB ^ (1<<PB0);
    cli();
    Impuls = 0;
    sei();
  }

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp. Ich gebe Dir recht das das nicht ganz richtig ist, 
jedoch löst das nicht mein Problem.

Wenn ich das Programm mit dem AVRStudio Simulator teste funktioniert es 
einwandfrei.
Daher vermute ich das irgendwas mit dem Makefile nicht stimmt. Ich hab 
zwar keine Ahnung warum und wieso aber....

wie schon öfters gesagt. Warum sind die An bzw. Aus-zeiten 
unterschiedlich. Das kann noch nicht einmal an einer Einstellung im 
Makefile leigen, oder?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ingo,
Ich gehe davon aus, das du die Fuses nicht programmiert hast, sodass 
sich diese noch im Defaultzustand befinden. Die Original-Atmeldoku 
(Seite 25, "Default Clock Source") sagt dazu folgendes:

The device is shipped with CKSEL = “0100”, SUT = “10”, and CKDIV8 
programmed.
The default clock source setting is the Internal RC Oscillator with 
longest start-up time and an initial system clock prescaling of 8,
*resulting in 1.0 MHz system clock.* ...

Also läuft der Controller mit 1 MHz, und nicht 8.

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Danke für den Tipp. Trotzdem hab ich noch das Problem das die 
Einschaltzeit im Verhältniss zur Ausschaltzeit etwa bei 1:3 leigt. Das 
ist mein größeres Problem. ich verstehe nicht wie das zustande kommen 
kann

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.