Pls alle rein

Gast #4461450
Lesenswert?

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) #4461530
Lesenswert?

µ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 #4461537
Lesenswert?

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 #4461544
Lesenswert?

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) #4461555
Lesenswert?

µ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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren