Forum: Compiler & IDEs LED Programm


von Maik S. (maisc)


Angehängte Dateien:

Lesenswert?

Hallo soll ein Programm schreiben welches 4 LED's über 4 taster 
anschaltet und ausschaltet und 4 LED's sollen nach TAstendruck 
zeitverzögert ausgehen, leider komme ich zu keinen richtigen Ergebnis.

Im Anhang das Programm aber ohne meinen Lösungsansatz, vielleicht hat ja 
jemand ne idee wo ich was in das Programm einfügen kann.

MFG

von Ralf G. (ralg)


Lesenswert?

Maik S. schrieb:
> Hallo soll ein Programm schreiben welches 4 LED's über 4 taster
> anschaltet und ausschaltet und 4 LED's sollen nach TAstendruck
> zeitverzögert ausgehen, leider komme ich zu keinen richtigen Ergebnis.
>
> Im Anhang das Programm aber ohne meinen Lösungsansatz, vielleicht hat ja
> jemand ne idee wo ich was in das Programm einfügen kann.
>
> MFG

Sollst du ein Programm schreiben oder kannst du bloß was 
einfügen?

von MaWin (Gast)


Lesenswert?

> DDRA &= ~(1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3) | (1<<PA4) | (1<<PA5) | 
(1<<PA6) | (1<<PA7);

Falsch.

> if( PINA & (1<<PA0))

Falsch. Du kannst nicht ohne Entprellung auf den Tasteneingang zugreifen

> if( debounce(PINA ,PA0) && (switch1_test == OFF) && (switch1 == OFF) )
> if( debounce(PINA ,PA0) && (switch1_test == OFF) && (switch1 == ON) )

Falsch, du kannst nicht 2 mal nacheinander auf dieselbe Taste entprellt 
zugreifen.

Von der Verzögerung des ausgehens sehe ich auch nichts, die 
Aufgabenbeschreibung ist auch eher unklar.


Ganz allgmein hast du mit deinem debounce dasselbe Problem welches 
Anwender von Peter Danneggers Enprellroutine haben: Sie führt dazu, 
falsch zu denken, falsch an die Lösung der Sache heranzugehen.

Ich nehme mal an, so soll es funktionieren:

char tasten,lampen,delay[4],i;
// Ports init
while(1)
{
  tasten=PINA;
  lampen=0;
  for(i=0;i<4;i++)
  {
    if(tasten&(1<<i)) delay[i]=100;
    if(delay[i]>0)
    {
      lampen|=1<<i;
      delay[i]--;
    }
  }
  PORTB=lampen;
  _delay_us(10000);
}

von Maik S. (maisc)


Lesenswert?

@ ralf g: soll eins schreiben kann aber auch einfügen.
@mawin: Naja in dem Fall ist PORTB mein Ausgang und PORTA mein EIngang, 
die Entprellung erfolgt mit dem oberen Teil nach define debounce. LED1 
bis 4 funktionieren aber soweit und ab der 5. soll die zeitverzögerung 
rein und da steht deshalb nichts weil ich mit meinem Latein am ende bin. 
Mit delay funktioniert es nicht da ich während der delay nichts anderes 
machen kann, deshalb soll die verzögerung mittels interrupt und timer 
funktionieren, weis aber nicht wie.

MFG

von Peter D. (peda)


Lesenswert?

Maik S. schrieb:
1
// LED_1, Schalter_1
2
3
    if( debounce(PINA ,PA0) && (switch1_test == OFF) && (switch1 == OFF) )
4
      {
5
        switch1 = ON;
6
        switch1_test = ON;
7
      }
8
    
9
    if( PINA & (1<<PA0)) 
10
      {
11
         switch1_test = OFF;
12
      } 
13
    
14
    if( debounce(PINA ,PA0) && (switch1_test == OFF) && (switch1 == ON) )
15
      {
16
        switch1 = OFF;
17
        switch1_test = ON;
18
       }
19
20
    if( switch1 == ON ) 
21
      {
22
        PORTB |= (1<<PB0);
23
         }
24
    
25
    if( switch1 == OFF )
26
      {
27
        PORTB &= ~(1<<PB0);
28
      }

Wie schon MaWin sagte, Du hast nicht verstanden, was Debounce macht und 
wie man es anwendet.
Es liefert das Drückereignis, nicht den Zustand.
Es darf für die selbe Taste nicht mehrmals expandiert werden.
Und direktes Pineinlesen macht das Debounce ja wieder zunichte.
Also machs doch genau so, wie im Beispielcode:
1
    if( debounce(PINA ,PA0))
2
        PORTB ^= (1<<PB0);


Peter

von Maik S. (maisc)


Lesenswert?

Ok habe es geändert, hat denn trotzdem jemand ne idee zu meinem 
eigentlichen Problem?

MFG

von Peter D. (peda)


Lesenswert?

Maik S. schrieb:
> Ok habe es geändert, hat denn trotzdem jemand ne idee zu meinem
> eigentlichen Problem?

Setz Dir für jede LED nen Zähler auf, der z.B. alle 10ms (Timer) 
runterzählt.
Und wenn er 0 ist, schalte aus.


Peter

von Maik S. (maisc)


Lesenswert?

Könntest das bitte mal posten wie das ungefähr aussehen sollte?

MFG

von Ralf G. (ralg)


Lesenswert?

Peter Dannegger schrieb:
> Wie schon MaWin sagte, Du hast nicht verstanden, was Debounce macht und
> wie man es anwendet.
Wenn ich Maik S. richtig verstanden habe, hat er sich das 'Programm' im 
Anhang organisiert um mit ein paar Einfügungen - am besten von Peter:

Maik S. schrieb:
> Könntest das bitte mal posten wie das ungefähr aussehen sollte?
>
> MFG

sein 'Eigenes' daraus zu basteln.

von Maik S. (maisc)


Lesenswert?

Richtig

von Karl H. (kbuchegg)


Lesenswert?

Maik S. schrieb:
> Könntest das bitte mal posten wie das ungefähr aussehen sollte?

Wo liegt das Problem

> Setz Dir für jede LED nen Zähler auf

Hier ist zb einer

uint8_t zaehlerLED0;


> der z.B. alle 10ms (Timer) runterzählt.

in der Hauptschfleife

  while( 1 ) {

    .....

    _delay_ms( 10 );
    if ( zaehlerLED0 > 0 )
      zaehlerLED0--;
  }

durch die Konstruktion der Hautschleife mit dem 10 Millisekunden ist 
gewährleistet, dass zaehlerLED0 alle 10 Millisekunden (+ dem was im 
Bereich ...... passiert) runtergezählt wird. Allerdings nur dann, wenn 
er nicht schon auf 0 steht.

> Und wenn er 0 ist, schalte aus.

    if ( zaehlerLED0 == 0 )
      schalte LED aus


Du musst jetzt noch:
Bei Tastendruck:
   die LED einschalten
   den Zahler auf einen Wert setzen, so dass er nach der gewünschten
   Zeitverzögerung wieder auf 0 heruntergezählt wurde und somit die
   LED ausschaltet.


Nur Mut, du wirst das hinkriegen. Machs erst mal nur für 1 Taster und 
für 1 LED. Und wenn das dann läuft, dann erweiterst du auf 4 Taster und 
4 LED.

von maisc (Gast)


Lesenswert?

Danke erstmal aber das Problem ist, dass bei dieser Variante während der 
verzögerte Vorgang läuft keine andere Aktion ausführbar ist, das sollte 
irgendwie mit einer ISR machbar sein??

von Karl H. (kbuchegg)


Lesenswert?

maisc schrieb:
> Danke erstmal aber das Problem ist, dass bei dieser Variante während der
> verzögerte Vorgang läuft keine andere Aktion ausführbar ist,

Natürlich ist sie das.

Wenn du Gulasch kochst und alle 1 Sekunde nachsiehst, ob es fertig ist, 
hast du dazwischen jede Menge Zeit was anderes zu tun. Du musst nur 
deine Tätigkeiten auf lauter kleine Zeitscheibchen runterbrechen. 
Überall ein bischen was tun und reihum alle Aufgaben durchgehen.

Was für dich als Person mühsam ist, ist für einen µC aber überhaupt kein 
Problem. Und eine Verzögerung von ein paar Millisekunden ist so kurz, 
dass es für einen Menschen immer noch 'gleichzeitig' darstellt.


> das sollte
> irgendwie mit einer ISR machbar sein??

Man kann das Runterzählen der Timervariable natürlich auch in einer ISR 
machen. Man wird das sogar sinnvollerweise dort machen. Ich habe 
allerdings nicht den Eindruck, dass du bereits soweit bist, dass du dich 
mit ISR herumschlagen solltest.

von maisc (Gast)


Angehängte Dateien:

Lesenswert?

@Karl Heinz Buchegger :
Ja habe noch nicht allzu viel Erfahrung damit, habe deinen Vorschlag 
grade mal ausprobiert aber irgendwie will das nicht funktionieren. Der 
Zähler passt scheinbar aber kann nicht 2 Taster gleichzeitig drücken.

von Peter D. (peda)


Lesenswert?

Nochmal:
Du darfst debounce für eine Taste nur einmal expandieren (= aufrufen), 
sonst funktioniert es nicht.
Es ist also klar, daß Dein Code nicht funktioniert.
Der 2. Aufruf ist auch völlig sinnlos.

Und diese delay-1000ms aber ganz schnell raus, das ist Pfui-Bäh.

Und nenn Deine Programme *.c, nicht *.txt!


Peter

von maisc (Gast)


Lesenswert?

OK habe den 2.Aufruf jetzt raus genommen und es funtioniert trotzdem, 
also wie versprochen. Was ist den an delay 1000ms so schlimm, kenne mich 
ja wie gesagt noch nicht so gut aus! Weis jetzt aber trotzdem nicht wie 
ich 2 taster gleichzeitig betätigen kann?

MFG

von Dominik S. (dasd)


Lesenswert?

> Was ist den an delay 1000ms so schlimm

Der µC macht in der Zeit eben überhaupt garnichts sondern wartet und ist 
somit eben "ausgeknockt".
Benutzt man einen Timer kann man parallel dazu noch etwas anderes tun 
wenn man es denn möchte.

von maisc (Gast)


Lesenswert?

Hallo zusammen habe jetzt hin und her probiert aber ich bekomme das mit 
dem Timer und der ISR einfach net hin hätte vielleicht jemand mal noch 
nen Denkanstoß wie ich das in mein obiges Programm einbinden kann.

MFG

von Peter D. (peda)


Lesenswert?

1
// Target: ATmega16
2
3
#define F_CPU                   1e6
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
9
#define debounce( port, pin )                                           \
10
({                                                                      \
11
  static uint8_t flag = 0;      /* new variable on every macro usage */ \
12
  uint8_t i = 0;                                                        \
13
                                                                        \
14
  if( flag ){                   /* check for key release: */            \
15
    for(;;){                    /* loop ... */                          \
16
      if( !(port & 1<<pin) ){   /* ... until key pressed or ... */      \
17
        i = 0;                  /* 0 = bounce */                        \
18
        break;                                                          \
19
      }                                                                 \
20
      _delay_us( 98 );          /* * 256 = 25ms */                      \
21
      if( --i == 0 ){           /* ... until key >25ms released */      \
22
        flag = 0;               /* clear press flag */                  \
23
        i = 0;                  /* 0 = key release debounced */         \
24
        break;                                                          \
25
      }                                                                 \
26
    }                                                                   \
27
  }else{                        /* else check for key press: */         \
28
    for(;;){                    /* loop ... */                          \
29
      if( (port & 1<<pin) ){    /* ... until key released or ... */     \
30
        i = 0;                  /* 0 = bounce */                        \
31
        break;                                                          \
32
      }                                                                 \
33
      _delay_us( 98 );          /* * 256 = 25ms */                      \
34
      if( --i == 0 ){           /* ... until key >25ms pressed */       \
35
        flag = 1;               /* set press flag */                    \
36
        i = 1;                  /* 1 = key press debounced */           \
37
        break;                                                          \
38
      }                                                                 \
39
    }                                                                   \
40
  }                                                                     \
41
  i;                            /* return value of Macro */             \
42
})
43
44
45
int main(void)
46
{
47
  uint16_t time[4] = {0};
48
49
  PORTB = 0xFF;                         // LEDs off (low active)
50
  DDRB = 0xFF;                          // Outputs on
51
52
  PORTA = 0xFF;                         // Pullups on
53
54
55
  for(;;){
56
    _delay_ms( 10 );                    // time base for delayed off
57
    if( debounce( PINA, PA0 ) )
58
      PORTB ^= 1<<PB0;                  // toggle
59
60
    if( debounce( PINA, PA1 ) )
61
      PORTB ^= 1<<PB1;                  // toggle
62
63
    if( debounce( PINA, PA2 ) )
64
      PORTB ^= 1<<PB2;                  // toggle
65
66
    if( debounce( PINA, PA3 ) )
67
      PORTB ^= 1<<PB3;                  // toggle
68
69
    if( debounce( PINA, PA4 ) ){
70
      PORTB &= ~(1<<PB4);               // LED on
71
      time[0] = 100 * 30;               // off after 30s
72
    }
73
    if( --time[0] == 0 )
74
      PORTB |= 1<<PB4;                  // LED off
75
76
    if( debounce( PINA, PA5 ) ){
77
      PORTB &= ~(1<<PB5);               // LED on
78
      time[1] = 100 * 30;               // off after 30s
79
    }
80
    if( --time[1] == 0 )
81
      PORTB |= 1<<PB5;                  // LED off
82
83
    if( debounce( PINA, PA6 ) ){
84
      PORTB &= ~(1<<PB6);               // LED on
85
      time[2] = 100 * 30;               // off after 30s
86
    }
87
    if( --time[2] == 0 )
88
      PORTB |= 1<<PB6;                  // LED off
89
90
    if( debounce( PINA, PA7 ) ){
91
      PORTB &= ~(1<<PB7);               // LED on
92
      time[3] = 100 * 30;               // off after 30s
93
    }
94
    if( --time[3] == 0 )
95
      PORTB |= 1<<PB7;                  // LED off
96
  }
97
}


Peter

von Karl H. (kbuchegg)


Lesenswert?

maisc schrieb:
> Hallo zusammen habe jetzt hin und her probiert aber ich bekomme das mit
> dem Timer und der ISR einfach net hin hätte vielleicht jemand mal noch
> nen Denkanstoß wie ich das in mein obiges Programm einbinden kann.


http://www.mikrocontroller.net/articles/FAQ#Timer
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

von maisc (Gast)


Lesenswert?

@ Peter:

Dankeschön, habe es soeben ausprobiert und es funktioniert einwandfrei.
Versuche jetzt den letzen Teil des Programms zu verstehen.

von Peter D. (peda)


Lesenswert?

maisc schrieb:
> Dankeschön, habe es soeben ausprobiert und es funktioniert einwandfrei.

Dann ist ja gut.
Ich hatte es nicht getestet. Manchmal können sich Schusselfehler 
einschleichen.

maisc schrieb:
> Versuche jetzt den letzen Teil des Programms zu verstehen.

Der Trick ist das Delay 10ms in der Mainloop.
Damit kann man leicht in 10ms Schritten Zeiten zählen.


Peter

von maisc (Gast)


Lesenswert?

Ja daran häng ich grad ein bischen dachte ne delay blockiert mein ganzes 
restliches Programm aber ist ja hier net so, warum? Und das mit dem 
time[4] ist doch ein array, oder? Also hast du quasi mit dem array 4 
variablen erzeugt, die mir die Verzögerung schaffen. Korrigiere mich 
bitte wenn ich da was falsch verstanden habe. Oder wie hast du dir das 
gedacht?

MFG

von Peter D. (peda)


Lesenswert?

Der Trick ist die Größe des Delays. 10ms ist sehr kurz, kriegt kein 
Mensch mit, 1000ms stören aber erheblich.

Und das Programm hat auch nichts kompliziertes zu rechnen, wo die 10ms 
CPU-Zeit fehlen könnten.

In größeren Programmen nimmt man zum Entprellen und als Zeitbasis 
natürlich einen Timer. Dann geht die CPU-Zeit nicht verloren und es 
können Berechnungen und schnellere Aufgaben erledigt werden.

Du kannst das Programm aber auch auf Timerinterrupt umstricken. Die 
Mainloop bleibt prinzipiell so, nur die Funktionen delay und debounce 
müssen geändert werden und die Initialisieung erweitert.


Peter

von maisc (Gast)


Lesenswert?

Hmm leichter gesagt als getan, habe zwar diese woche viel dazu gelernt 
aber das mit dem Timerinterrupt will nicht so richtig funktionieren.
Naja mal schauen.

von maisc (Gast)


Lesenswert?

@ Peter:

Hallo erstmal, bin schon wieder am grübeln, die taster mit der 
zeitverzögerung sollen erst verzögern wenn ich den taster los lasse, 
also egal wie lang er gedrückt ist soll erst nach dem loslassen die 
Verzögerung eintreten, habe schon wieder etliche Überlegungen angestellt 
aber keine hat zum gewünschten Ergebnis geführt. Hast du ne idee?

MFG

von Uwe (de0508)


Lesenswert?

Hallo,

wenn Du mehr Taster-Funktionen benötigst, solltest Du dir die Bibliothek 
von Peter ansehen:

- Beitrag "Universelle Tastenabfrage"

Speziell, wenn alle Erweiterungen umgesetzt sind, hilft dieser 
Darstellung sehr:

- Beitrag "Re: Universelle Tastenabfrage"
- Beitrag "Re: Universelle Tastenabfrage"

mein Beispiel Code ist hier veröffentlicht:

- Beitrag "Re: 3fach Timer (einschaltverzögerung)"

Ich hoffe nun steinigt mich keiner, da die Komplexität deines Programms 
damit natürlich steigt !

von Karl H. (kbuchegg)


Lesenswert?

maisc schrieb:

> aber keine hat zum gewünschten Ergebnis geführt. Hast du ne idee?

Du musst schön langsam anfangen deine Problemstellungen selbst zu lösen. 
Wenn du analysiert und verstanden hast, wie die Entprellung in dieser 
Makroform funktioniert, dann ist es nicht wirklich schwer das auf 
Loslassen von Tasten umzuarbeiten.

Aber: Du musst im Detail verstehen, wie diese Entprellung überhaupt in 
der jetzigen Form funktioniert. Und das ist Analysearbeit.

Und nein: Es ist durchaus nicht ungewöhnlich, dass man für seine ersten 
eigenständigen algorithmischen Arbeiten Stunden bzw. Tage braucht. 
Papier und Bleistift sind da gute Hilfsmittel, genauso wie das Spielchen 
das sich "Jetzt bin ich der Computer und arbeite mein Programm mal 
durch" nennt eine gute Hilfe ist.

Sorry. Aber da musst du durch, wenn du bei der Programmierung bleiben 
willst. Wir alle mussten das. Ohne genaue Analyse von vorhandenem Code, 
und zwar bis ins Detail, geht nun mal nichts. Man muss die Idee hinter 
einem Code verstehen, ehe man dann daran geht, diese Idee umzuarbeiten 
und dann aus dieser umgearbeiteten Idee den neuen Programmcode zu 
generieren. Auf gut Glück da und dort einen vorhandenen Code zu ändern, 
funktioniert praktisch nie.

von maisc (Gast)


Lesenswert?

So habe jetzt etliche Tutorien, Beispiele durchgeschaut aber irgendwie 
will das einfach nicht so richtig in meinen Kopf rein, hat nicht 
vielleicht doch jemand ne idee wie ich das lösen könnte?

@Karl Heinz: Ja das hab ich schon mitbekommen, will das ja auch 
verstehen und dann anwenden aber brauch jetzt erstmal dringend ne Lösung 
und danach werde ich mich weiter damit auseinander setzen.

MFG

von Peter D. (peda)


Lesenswert?

1
    if( debounce( PINA, PA4 ) ){
2
      PORTB &= ~(1<<PB4);               // LED on
3
      time[0] = 100 * 30;               // off after 30s
4
    }
5
    if( PINA & 1<<PA4 )                 // if key released:
6
      if( --time[0] == 0 )              // count down
7
        PORTB |= 1<<PB4;                // LED off


Peter

von maisc (Gast)


Lesenswert?

Dankeschön, funktioniert. Aber jetzt bin aich noch mehr verwirrt, dachte 
wenn ich debounce anwende und danach den PIN nochmal direkt einlesen 
hebt das debounce auf??? Wurde zumindest bei meinen ersten Versuchen 
kritisiert.

MFG

von Peter D. (peda)


Lesenswert?

Keine Regel ohne Ausnahme.
In diesem Fall wird ja keine Aktion ausgeführt, also stört ein Prellen 
beim Loslassen nicht.
Es wird nur das Zählen verzögert.

Man kann es aber auch mit dem entprellten Zustand machen, dazu muß man 
aber debounce etwas modifizieren, damit es diesen internen Zustand 
ausgibt.


Peter

von maisc (Gast)


Lesenswert?

Achso, danke nochmal. So werde mich jetzt mal hinter den Code klemmen um 
ihn nachvollziehen zu können, werde mir mühe geben.

MFG

von Friedrich (Gast)


Lesenswert?

Hallo Hallo

Ich habe mir das AVR Bord von Pollin besorgt und schreibe gerade meine 
ersten Programme in C. Besser gesagt mein erstes Programm in C.
Als Mikrocontroller benutze ich den Maga8. Software AVR Studio 4 zum 
brennen bnutze ich PonyProg2000

Und hier das Programm

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

#ifndef F_CPU
#warning "F_CPU nicht definiert!!!"
#define F_CPU 12000000UL
#endif
int i,a,b,erg;

ISR (TIMER0_OVF_vect)
{
   PORTD^= (1<< PD5)|(1<< PD6);
   //PORTD^= (1<< PD6);
   DDRD|= (1<<DDD5) | (1<<DDD6);
}

void zeit (void)
{

        //TIMER0_OVF_vect();
        //DDRD|= (1<<DDD5) | (1<<DDD6);
        TCCR0|= (1<<CS00)|(1<<CS02);
        sei();
        TIMSK|= (1<<TOIE0);
        TIMSK&= ~(1<<TOIE0);


}

int main(void)


{
   while (1)
    {
           zeit();
           b++;
           a=b+1;

        if (a>=5000)
            {
                PORTD|=(1<<PD6);
                PORTD&=~(1<<PD5);
                    i++;
                    i=i+1;
             }

                if (i==5000)
                    {
                       PORTD|=(1<<PD5);
                       PORTD&=~(1<<PD6);
                            a=0;
                            b=0;
                            i=0;
                    }



    }
 }

Frage: Warum funktioniert der Vorteiler (Prescaler) nicht???
Was mache ich falsch???

Vielen Dank!

Für die Hilfe!


Friedrich

p.s. Wie macht ihr denn hier die farbliche Unterlegung? Ich benutze 
Notepad, da lassen sich aber die Farben icht mit kopieren.

von Karl H. (kbuchegg)


Lesenswert?

Was für einen Sinn soll es haben


        TIMSK|= (1<<TOIE0);
        TIMSK&= ~(1<<TOIE0);


den Overflow Interrupt freizugeben und danach gleich wieder zu sperren?

Organisier erst mal deinen Programmaufbau.
Für deine nächsten Programme sieht dein Aufbau praktisch immer so aus:
1
int main()
2
{
3
4
   initialisieren der Hardware
5
   dazu gehören zb die Portpins auf Ein-oder Ausgang stellen
6
   die Timer konfiguerieren.
7
   Eben alles was nur EINMAL gemacht wird.
8
9
10
   sei();
11
12
   while( 1 ) {
13
14
      hier kommt die Programmlogik rein.
15
      Also das, was dein Programm regulär zu tun hat
16
17
  }
18
}


wenn du deine Intialisierungen quer über das Programm verstreust und 
dann auch noch in der Hauptschleife dauernd die Konfiguration änderst, 
darfst du dich nicht wundern, wenn nichts geht. Initialisierungen macht 
man nur EINMAL. Darum heißt es auch Initialisieren - einen definierten 
Anfangszustand herstellen.

von Karl H. (kbuchegg)


Lesenswert?

Und wenn du 'gleichzeitig' in der ISR UND in der Hauptschleife an den 
LED rumfummelst, kann kein Mensch genau sagen, welchen Zustand die LED 
haben werden.

von Karl H. (kbuchegg)


Lesenswert?

> Frage: Warum funktioniert der Vorteiler (Prescaler) nicht???

Woran machst du fest, dass dein Prescaler nicht funktioniert?
Auf wieviel hast du ihn den eingestellt? Wie oft wird daher die ISR 
aufgerufen?

von Karl H. (kbuchegg)


Lesenswert?

Und weil ichs gerade sehe:
Bitte kapere nicht einen alten Thread um deine Frage zu stellen! Fang 
einen neuen Beitrag an.

von Friedrich (Gast)


Lesenswert?

Hallo Karl!

Ich hoffe das ich dich mit deinem Vornamen ansprechen darf.
Sorry, das ich da etwas unstrukturiert bin.
Ich werden auch einen neuen Beitrag anfangen. Aber zu vor möchte ich 
gerne deine Fragen die du mir gestellt hast beantworten.

>
>
>         TIMSK|= (1<<TOIE0);
>         TIMSK&= ~(1<<TOIE0);
>
>
> den Overflow Interrupt freizugeben und danach gleich wieder zu sperren?
>

Ich bin davon ausgegangen, dass der Overflow dann gelöscht wird, 
beziehungsweise rückgesetzt wird.


> Woran machst du fest, dass dein Prescaler nicht funktioniert?
> Auf wieviel hast du ihn den eingestellt? Wie oft wird daher die ISR
> aufgerufen?

Den Prescaler habe ich auch schon auskommentiert und da hat sich nix 
geändert beim Blinken. Einstellung hatte ich auf 1024 eingestellt.
Siehe Datenblatt
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
Die ISR wird einmal aufgerufen, wenn ich das richtig verstanden habe, 
oder???
Gibt es da zu auch gute Bücher um einen den Einstieg zu erleichtern???

Wenn ich wieder zu Hause bin, werde ich gleich das Programm überarbeiten 
und dann einen neuen Beitrag anfangen.

Ich bitte alle anderen auf einen Kommentar hier zu verzichten, da ich 
einen neuen Beitrag heute Nachmittag hier rein stellen werde unter dem 
Thema.
"Vorteiler / Prescaler funktioniert nicht Mega8"

Vielen Dank!

Friedrich

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.