Pls alle rein

Gast #4461450
Hallo zusammen,
ich bin ganz neu in C Sachen
ich möchte PORTC PC0 auf 1 für 15 sek dann wieder auf 0 danach wieder 
auf 1 dann auf 0. Dazwischen soll eine dauert von 10 sec. Ich verwende 
Timer und Prescaler 64

1
while(1)
2
  {
3
    
4
    if (TIFR & (1 << OCF1A))
5
    {
6
      PORTB ^= ( 1 << PB0 ) | ( 1 << PB1 );
7
    
8
      ElapsedIntervall++;
9
      if (ElapsedIntervall >= (60 * TIMEINTERVAL))
10
      {
11
         //PORTB |= ( 1 << PB7 );
12
         //LongWait(100);
13
         //PORTB &= ~( 1 << PB7 );
14
         ElapsedDays++;
15
         
16
         PORTC |= ( 1 << PC0 ); 
17
         LongWait(ElapsedPressedButton);
18
         PORTC &= ~( 1 << PC0 ); 
19
         //LongWait(ElapsedPressedButton);
20
         
21
         LongWait(10000);
22
         
23
         PORTC |= ( 1 << PC0 ); 
24
         LongWait(ElapsedPressedButton);
25
         PORTC &= ~( 1 << PC0 ); 
26
         LongWait(ElapsedPressedButton);
27
         
28
         ElapsedIntervall = 0;
29
      }
30
    
31
      TIFR = (1 << OCF1A);
32
      
33
    }
34
    //if (ElapsedDays >= ((RUNDAYS * 86400) / (TIMEINTERVAL * 60)))
35
    //{
36
       //Sleep_Maker();
37
       //PORTB &= ~( 1 << PB0 ) | ~( 1 << PB1 );
38
       //PORTB ^= ( 1 << PB7 );
39
       //LongWait(100);
40
       //ElapsedDays = 0;
41
       
42
    //}
43
    
44
  }
(Firma: matzetronics)
µC Looper schrieb:
> PORTC |= ( 1 << PC0 );
>          LongWait(ElapsedPressedButton);
>          PORTC &= ~( 1 << PC0 );

Wenn PC0 gesetzt wird und nie wieder gelöscht, dann würde ich mal diese 
Unterroutine mitposten. Die von gcc gelieferte ms_delay() Routine z.B. 
schluckt nur Konstanten und keine Variablen.
Wenn das übrigens wirklich so ein langes Warten ist, wird das Löschen 
von OCF1A mit Sicherheit zu spät kommen - aber das ist Raterei, wenn du 
die entscheidende Routine LongWait() nicht zeigst.
Gast
Die fehlenden Antworten liegen vermutlich daran, dass da nur ein 
Bruchteil des Codes steht und bergeweise Informationen fehlen. Die 
Aussage "Ich verwende Timer und Prescaler 64" bringt genauso viel, wie 
"Ich habe ein Auto".
Wie genau hast Du Deinen Timer konfiguriert. In welchen Intervall 
erwartest Du, dass er triggert, ...

Ausserdem steht da "LongWait" - kenn' ich nicht. Klingt aber nach 
busy-waiting, was per definition "böse" ist.

Ein paar ganz allgemeine Tips:
- Nie busy-waiting, immer StateMachine, ausser Du weisst ganz genau was 
Du tust.
- Lass Deinen Timer im Interrupt einen globalen Zähler hochzählen (z.B. 
im Millisekundentakt) und verwende diesen Zähler als globale Zeitbasis 
(manche Architekturen haben dafür einen SysTickCounter). Je nach Bedarf 
16 oder 32 bit Integer.
- Lass in der Main-Loop eine LED durchgehend blinken. z.B. mit
1
if ((sysTickCounter & 0xFF) == 0) toggleLed();
 Damit weißt Du dass Dein Timer läuft und Dein Programm nicht in 
irgendwelchen Interrupts oder Busy-Waiting-Kram (den Du ja eh nicht mehr 
machst) hängt.

Du wirst sehen, wenn Du diese Ratschläge befolgst, wirst Du Dein Problem 
nicht mehr haben...
Gast
Der Code:
1
int main(void)
2
{
3
  unsigned long int ElapsedIntervall = 0;
4
  unsigned long int ElapsedDays = 0;
5
  unsigned long int ElapsedPressedButton = TIMEPRESSBUTTON;
6
  unsigned long int ElapsedSleepPressed= SLEEPTIME;
7
  //unsigned long int PulsCounter = 0;
8
  
9
  DDRB = 0x03;
10
  DDRC = 0x01;
11
  
12

13
  TCCR1B |= ( 1 << WGM12 );
14
  OCR1A   = 15624;
15
  TCCR1B |= (( 1 << CS10 ) | ( 1 << CS11 ));
16
  
17
  PORTC &= ~( 1 << PC0 );
18

19
  while(1)
20
  {
21
    
22
    if (TIFR & (1 << OCF1A))
23
    {
24
      PORTB ^= ( 1 << PB0 ) | ( 1 << PB1 );
25
    
26
      ElapsedIntervall++;
27
      if (ElapsedIntervall >= (60 * TIMEINTERVAL))
28
      {
29
         PORTC |= ( 1 << PC0 );
30
         LongWait(ElapsedPressedButton);
31
         PORTC &= ~( 1 << PC0 ); 
32
         //LongWait(ElapsedPressedButton);
33
         
34
         LongWait(1000);
35
         
36
         PORTC |= ( 1 << PC0 ); 
37
         LongWait(ElapsedPressedButton);
38
         PORTC &= ~( 1 << PC0 ); 
39
         
40
         ElapsedDays++;
41
         ElapsedIntervall = 0;
42
      }
43
    
44
      TIFR = (1 << OCF1A);
45
      //PORTC &= ~( 1 << PC0 );
46
      
47
    }
48
    //if (ElapsedDays >= ((RUNDAYS * 86400) / (TIMEINTERVAL * 60)))
49
    //{
50
       //Sleep_Maker();
51
       //PORTB &= ~( 1 << PB0 ) | ~( 1 << PB1 );
52
       //PORTB ^= ( 1 << PB7 );
53
       //LongWait(100);
54
       //ElapsedDays = 0;
55
       
56
    //}
57
    
58
  }
59
  
60
  return 0;
61
}
(Firma: matzetronics)
µC Looper schrieb:
> DDRB = 0x03;
>   DDRC = 0x01;
>
>
>   TCCR1B |= ( 1 << WGM12 );
>   OCR1A   = 15624;
>   TCCR1B |= (( 1 << CS10 ) | ( 1 << CS11 ));

Naja, das riecht schon nach AVR. Aber ich sehe da nach wie vor nur ein 
main() und keinerlei Unterroutinen. Ausserdem wird PC0 ja gesetzt, aber 
nie wieder gelöscht, was die Theorie mit dem PIC unwahrscheinlich werden 
lässt.

Antwort schreiben

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