C-Code funktioniert nicht

Gast #3476932
1
#define F_CPU 1000000UL     /* 1MHz */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
// Defines:
6
#define LED1    (1<<PD5)
7
#define LED2    (1<<PD6)
8
 
9
//Variablen für die Zeit
10
volatile unsigned int millisekunden;
11
volatile unsigned int sekunde;
12
volatile unsigned int minute;
13
volatile unsigned int stunde;
14
 
15
int main(void)
16
{
17

18
// LED-Pins als Ausgang definieren
19
  DDRD |= LED1 | LED2;
20
 
21
  // LED1 einschalten
22
  PORTD |= LED1;
23
  
24
  
25
  // Timer 0 konfigurieren
26
  TCCR0A = (1<<WGM01); // CTC Modus
27
  TCCR0B |= (1<<CS01); // Prescaler 8
28
  // ((1000000/8)/1000) = 125
29
  OCR0A = 125-1;
30
 
31
  // Compare Interrupt erlauben
32
  TIMSK |= (1<<OCIE0A);
33
 
34
  // Global Interrupts aktivieren
35
  sei();
36
 
37
  while(1)
38
  {
39
    if ( minute == 2 )
40
  {
41
  PORTD |= LED2;
42
  
43
  }
44
  }
45
}
46
 
47
/*
48
Der Compare Interrupt Handler 
49
wird aufgerufen, wenn 
50
TCNT0 = OCR0A = 125-1 
51
ist (125 Schritte), d.h. genau alle 1 ms
52
*/
53
ISR (TIMER0_COMPA_vect)
54
{
55
  millisekunden++;
56
  if(millisekunden == 1000)
57
  {
58
    sekunde++;
59
    millisekunden = 0;
60
    if(sekunde == 60)
61
    {
62
      minute++;
63
      sekunde = 0;
64
    }
65
    if(minute == 60)
66
    {
67
      stunde++;
68
      minute = 0;
69
    }
70
    if(stunde == 24)
71
    {
72
      stunde = 0;
73
    }
74
  }
75
}

Hallo, ich habe einige Fragen bezüglich des Codes.
1. Wieso will mit das Atmelstudio dieses Ding nicht bauen?
2. Wie sage ich, dass die LED nicht nur genau am Zeitpunkt minute == 2 
leuchten soll, sondern auch danach? Danke!
(Firma: privatfrickler.de)
Oldie schrieb:

> 1. Wieso will mit das Atmelstudio dieses Ding nicht bauen?

soll das ein Rätsel sein? Atmel Studio hat dir doch gesagt, warum es 
„Das Ding“ nicht bauen will. Wie wäres es, wenn du uns das auch 
verrätst?

> 2. Wie sage ich, dass die LED nicht nur genau am Zeitpunkt minute == 2
> leuchten soll, sondern auch danach? Danke!

Warum gehst du davon aus, dass es nicht schon so ist?

vlg
 Timm
Gast
Timm Reinisch schrieb:
> Wie wäres es, wenn du uns das auch
> verrätst?

Screenshot nachgereicht.

Timm Reinisch schrieb:
> Warum gehst du davon aus, dass es nicht schon so ist?

Ist es denn so?
Ich weiß es eben nicht, aber wenn man stur dem Code folgt, so wird bei 
minute == 2 der PORTD aktiviert. Es kann ja sein, dass bei minute == 3 
der PORTD nicht mehr aktiviert ist, da der Zustand minute == 2 nicht 
mehr existent ist
Gast
g457 schrieb:
> ..arggs, die iss ja drin.. mmcu adäquat setzen und die richtigen(tm)
> defines nutzen</ingrid>

Sorry, könntest du das für einen dummen Idioten wie mich etwas genauer 
erklären und mir genauer sagen, was uich da noch wo hinschreiben muss? 
:)
Gast
Frage 1:

Du hast dem AVR Studio nicht mitgeteilt um welcken Controller es sich 
handelt (z.B. ATMega8) oder hast den falschen gewählt.

Frage 2:

LED ist in der while solange Minute==2 immer an, danach aber auch. 
Solange es nichts gibt was das zurücksetzt zumindest.
Gast
Okay ich Idiot habe bei TCCR1B anstatt der 1 immer eine 0 geschrieben 
-.-

Neues Problem: Die LED2 leuchtet nicht, selbst wenn ich millisekunden = 
1 mache... Jemand ne Lösung?
Gast
>Okay ich Idiot habe bei TCCR1B anstatt der 1 immer eine 0 geschrieben
>-.-

>Neues Problem: Die LED2 leuchtet nicht, selbst wenn ich millisekunden =
>1 mache... Jemand ne Lösung?

Hm, benutzt du jetzt den Timer 1 oder 0 ?
Hast du die Bezeichnungen für den richtigen Typen eingebunden?
Weil deine Definitionen nicht zum mega8 passen. Lass mich raten, du hast 
den code irgendwo kopiert und und willst ihn jetzt auf dem mega8 
verwenden. Der kennt diese Register gar nicht, die heissen da anderst!

Die heissen da TCNT0, TCCR0 und TIMSK. Tu uns allen einen gefallen und 
schau mal ins Datenblatt!
(Firma: privatfrickler.de)
Oldie schrieb:
> Marek Walther schrieb:
>> TCCR0 |= (1<<CS01); // Prescaler 8
>>
>> Sorry, sollte doch Timer 0 sein oder?
>
> Ja, das wird nun erkannt... du hast einfach das B weggelassen. Soll ich
> das bei den anderen undeklarierten auch machen?

wie gehst du denn vor? Ich frage mich, woher du bei einem ATMega8 ein 
TCCR0B hattest? Das gibt es gar nicht. Wie bist du denn darauf gekommen?

Datenblatt schauen um die Optionen zu bauen!

vlg
 Timm
Gast
>  // Timer 0 konfigurieren
>  TCCR0A = (1<<WGM01); // CTC Modus

Timer0 hat auch keinen CTC-Modus -> Timer1 oder 2 verwenden. Und, ganz 
wichtig, Datenplatt lesen.
Gast
Hmm kurze Frage: Ich möchte ja nur, wie ihr es bereits festgestellt 
habt, eine LED nach 2 Stunden/Minuten... leuchten lassen. Wie würdet ihr 
das schreiben?  Geht's auch simpler? Vielleicht mit timer0? Würde mich 
freuen, wenn jemand nen beispiel kurz schreiben könnte!
Danke
Wenn man weiß was man tut, dann ja.
Wenn man das nicht weiß, dann nein.

Aber wo ist denn das Problem? Nimmst du halt den Timer 1 dafür her.
Das ist doch kein Beinbruch.

Aber mit der Attitüde "Ich kopier mir das alles zusammen ohne es zu 
verstehen" wird das nun mal nichts.

FAQ: Timer
und dazu das Datenblatt deines Prozessors (ATMega8).

Aus der FAQ (beim CTC Modus) findest du das prinzipielle Vorgehen. Und 
das wendest du jetzt eben auf DEINEN µC und das zu DIESEM µC gehörende 
Datenblatt und den Timer 1 an. Timer 1 deswegen, weil das auf dem Mega8 
der einzige Timer ist, der den CTC Modus unterstüzt. Der Timer 0 tut das 
nun mal nicht. Auf einem anderen µC ist das eben anders. Der Timer 0 vom 
Mega 16 hat einen CTC Modus. Der vom Mega8 hat ihn nicht.
Wo ist denn da das Problem? Ist doch vom Prinzip her genau dasselbe nur 
mit anderen Register und/oder Bitnamen wie beim Timer 0. Du musst in 
erster Linie das Prinzip der Vorgehensweise aus der FAQ übernehmen und 
nicht so sehr die konkreten Register/Bitnamen. Die sind beim Mega8 bzw. 
dem Timer 1 dann eben andere. Aber das Prinzip "Fang bei der 
Modustabelle an, hol dir dort die Bitnamen raus, scroll zurück und sieh 
nach in welchem Register das jeweilige Bits sitzt", das ist da wie dort 
genau das gleiche.

Oder kommst du beim Autofahren durcheinander, wenn beim einen Auto der 
Rückwärtsgang in der H-Schaltung rechts unten und beim anderen 
links/oben ist? Du siehst auf das 'Datenblatt', welches in diesem Fall 
auf den Gangknüppel aufgedruckt ist, und orientierst dich daran, wie das 
bei diesem konkreten Automodell geht. Blindes 'Übernehmen' der 
Knüppelstellung hingegen führt dazu, dass du bei dem einen Auto anstatt 
in den 6. Gang dann eben bei Tempo 180 auf der Autobahn den 'R wie 
Ralley'-Gang einlegst und dir das Getriebe um die Ohren fliegt.
Gast
Okay, nun bin ich mir sicher, die richtigen Register anzusprechen, 
leider funktioniert es immer noch nicht :(
1
#define F_CPU 1000000UL     /* 1MHz */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
// Defines:
6
#define LED1    (1<<PD5)
7
#define LED2    (1<<PD6)
8

9
//Variablen für die Zeit
10
volatile unsigned int millisekunden;
11
volatile unsigned int sekunde;
12
volatile unsigned int minute;
13
volatile unsigned int stunde;
14

15
int main(void)
16
{
17

18
  // LED-Pins als Ausgang definieren
19
  DDRD |= LED1 | LED2;
20
  
21
  // LED1 einschalten
22
  PORTD |= LED1;
23
  
24
  
25
  // Timer 1 konfigurieren
26
  TCCR1A = (1<<COM1A0);  // CTC Modus
27
  TCCR1B |= (1<<CS11); // Prescaler 8
28
  // ((1000000/8)/1000) = 125
29
  OCR1A = 125-1;
30
  
31
  // Compare Interrupt erlauben
32
  TIMSK = (1<<OCIE1A);
33
  
34
  // Global Interrupts aktivieren
35
  sei();
36
  
37
  while(1)
38
  {
39
    if ( sekunde == 5 )
40
    {
41
      PORTD |= LED2;
42
      
43
    }
44
  }
45
}
46

47
/*
48
Der Compare Interrupt Handler
49
wird aufgerufen, wenn
50
TCNT0 = OCR0A = 125-1
51
ist (125 Schritte), d.h. genau alle 1 ms
52
*/
53
ISR (TIMER0_COMPA_vect)
54
{
55
  millisekunden++;
56
  if(millisekunden == 1000)
57
  {
58
    sekunde++;
59
    millisekunden = 0;
60
    if(sekunde == 60)
61
    {
62
      minute++;
63
      sekunde = 0;
64
    }
65
    if(minute == 60)
66
    {
67
      stunde++;
68
      minute = 0;
69
    }
70
    if(stunde == 24)
71
    {
72
      stunde = 0;
73
    }
74
  }
75
}
Gast
Es passiert mir immer wieder das ich in so einen thread reinlese.
Dabei stelle ich für mich fest das ich als antwortender schon längst die 
EngelsGeduld verloren hätte.

Da gibt man dem TO alles was er braucht und er liest und/oder versteht 
nicht.

Dariwn sagt : Lasst Ihn sterben. :((((((((((
engels schrieb:
> Dariwn sagt : Lasst Ihn sterben. :((((((((((

Man kann nicht alle sterben lassen. Manchmal ist einem danach etwas fürs 
Leben lassen zu tun.

Oldie schrieb:
> Hubert G. schrieb:
>> TCCR1A = (1<<COM1A0);  // CTC Modus
>>   TCCR1B |= (1<<CS11); // Prescaler 8
>> Hier ist noch ein Fehler.
>> Die Led2 schaltest du nie mehr aus.
>
> Wo ist denn da der Fehler?
> Das hat doch nichts mit dem ausschalten der LED zu tun, oder?

Nein, es hat nichts mit der Led zu tun, das ist etwas zusätzliches.
In der TCCRA Zeile ist der Kommentar falsch.
In der TCCRB Zeile fehlt dafür etwas.
Der Fehler in meiner vorhergehenden Post ist auch noch aktuell.
Das ist aber ein Zeichen das du nur mit Copy und Paste arbeitest und im 
Datenblatt soviel wie nichts gelesen hast.
Es war sicher nur der Tod als Programmierer gemeint.
1
ISR (TIMER0_COMPA_vect)

Welchen Timer verwendest du?
1
TCCR1A = (1<<COM1A0);  // CTC Modus
Hier steht im Datenblatt nichts von CTC Modus

In meinem Datenblatt Tabelle 39, steht das man für CTC das Bit "WGM12" 
für den Timer1 setzen muss. Das Bit befindet sich im Register "TCCR1B". 
Bei dir vermisse ich das.
1
TCCR1B |= (1<<CS11); // Prescaler 8

Du setzt hier die Led2
1
    if ( sekunde == 5 )
2
    {
3
      PORTD |= LED2;
aber sie geht nie wieder aus, es sei denn du willst das so.
Gast
1
#define F_CPU 1000000UL     /* 1MHz */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
// Defines:
6
#define LED1    (1<<PD5)
7
#define LED2    (1<<PD6)
8

9
//Variablen für die Zeit
10
volatile unsigned int millisekunden;
11
volatile unsigned int sekunde;
12
volatile unsigned int minute;
13
volatile unsigned int stunde;
14

15
int main(void)
16
{
17

18
  // LED-Pins als Ausgang definieren
19
  DDRD |= LED1 | LED2;
20
  
21
  // LED1 einschalten
22
  PORTD |= LED1;
23
  
24
  
25
   // Timer 1 konfigurieren
26
   TCCR1B = (1<<WGM12);  // CTC Modus
27
  TCCR1B |= (1<<CS11); // Prescaler 8
28
   // ((1000000/8)/1000) = 125
29
   OCR1A = 125-1;
30
  
31
  // Compare Interrupt erlauben
32
 // Compare Interrupt erlauben
33
 TIMSK = (1<<OCIE1A);
34
  
35
  // Global Interrupts aktivieren
36
  sei();
37
  
38
  while(1)
39
  {
40
    if ( sekunde == 5 )
41
    {
42
      PORTD |= LED2;
43
      
44
    }
45
  }
46
}
47

48
/*
49
Der Compare Interrupt Handler
50
wird aufgerufen, wenn
51
TCNT0 = OCR0A = 125-1
52
ist (125 Schritte), d.h. genau alle 1 ms
53
*/
54
ISR(TIMER1_COMPA_vect)
55
{
56
  millisekunden++;
57
  if(millisekunden == 1000)
58
  {
59
    sekunde++;
60
    millisekunden = 0;
61
    if(sekunde == 60)
62
    {
63
      minute++;
64
      sekunde = 0;
65
    }
66
    if(minute == 60)
67
    {
68
      stunde++;
69
      minute = 0;
70
    }
71
    if(stunde == 24)
72
    {
73
      stunde = 0;
74
    }
75
  }
76
}
so steht das im Datenblatt, was ist daran jetzt falsch?
Gast
Christian B. schrieb:
> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?

OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
Ich hab es nicht mal compiled, weil ich bereits davon ausging zu 
scheitern!
Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!
Gast
Oldie schrieb:
> Christian B. schrieb:
>> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?
>
> OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
> Ich hab es nicht mal compiled, weil ich bereits davon ausging zu
> scheitern!
> Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
> SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!

Und das alles ganz ohne Eigenleistung - Du kannst wirklich stolz auf 
dich sein...
Gast
herrscher schrieb:
> Oldie schrieb:
>> Christian B. schrieb:
>>> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?
>>
>> OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
>> Ich hab es nicht mal compiled, weil ich bereits davon ausging zu
>> scheitern!
>> Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
>> SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!
>
> Und das alles ganz ohne Eigenleistung - Du kannst wirklich stolz auf
> dich sein...

Es gibt Kollegen, die so zum Manager werden.
herrscher schrieb:

> Und das alles ganz ohne Eigenleistung - Du kannst wirklich stolz auf
> dich sein...


Wollen wir mal hoffen, dass der Code
1
   // Timer 1 konfigurieren
2
   TCCR1B = (1<<WGM12);  // CTC Modus
3
  TCCR1B |= (1<<CS11); // Prescaler 8
aus dem Studium der Modus-Tabelle bzw. Registerbeschreibung aus dem 
Datenblatt resultiert und nicht aus diesen Hinweisen
1
TCCR1A = (1<<COM1A0);  // CTC Modus
2
Hier steht im Datenblatt nichts von CTC Modus
3
In meinem Datenblatt Tabelle 39, steht das man für CTC das Bit "WGM12" für
4
den Timer1 setzen muss. Das Bit befindet sich im Register "TCCR1B". Bei
5
dir vermisse ich das.
6

7
TCCR1B |= (1<<CS11); // Prescaler 8

Es gibt ja auch Leute, die das Datenblatt meiden, wie der Teufel das 
Weihwasser, mit dem Argument "Ich kann kein Englisch". Irgendwie habe 
ich das Gefühl, dass wir es hier mit genau so einem Fall zu tun haben. 
Dabei bräuchte er im Grunde gar nicht viel Englisches lesen (weil eh 
schon alles vorgekaut wurde), sondern nur 'Bildchen schauen' (bzw. 
Tabellen schauen) und die Bezeichnungen von dort im Programm 
zusammenführen.
Oldie schrieb:
> Christian B. schrieb:
>> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?
>
> OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
> Ich hab es nicht mal compiled, weil ich bereits davon ausging zu
> scheitern!
> Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
> SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!

Also ich würde dir jetzt nicht empfehlen dich mit einem Krieger 
anzulegen. Der lässt dir nämlich kein 999 Versuche Zeit, dein 
Skill-Level genügend aufzubauen.

Ansonsten könnte folgende Aussage schnell Realität werden:
> engels (Gast):
> Dariwn sagt : Lasst Ihn sterben. :((((((((((

Trainiere weiter und lese des verdammte Datenblatt. Am besten druckst du 
dir das aus und heftest es ab, dann gab es da einmal noch so bunte 
Klebezettelchen zum organisieren.

So, jetzt auf zur Runde II.
-> Tastaturabfrage interruptgesteuert zur Einstellung des Zeitintervalls 
und zur Abschaltung der LED.

Viel Glück Tiger.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 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.