Forum: Mikrocontroller und Digitale Elektronik Pls alle rein


von µC Looper (Gast)


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
  }

von µC Looper (Gast)


Lesenswert?

Ich bitte euch um Hilfe. Es funktioniert leider nicht
PC0 wirs auf 1 für 15 gesetzt dann nicht mehr

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von mh (Gast)


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...

von µC Looper (Gast)


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
}

von Prophet (Gast)


Lesenswert?

Bestümmpt ein PIC wo auf PC0 und PC1 ein Quarz erwartet wird.

Das muss man natürlich ausschalten. Dazu muss Man[n] dann
halt einmal ins Datenblatt schauen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

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.