Probleme mit ISR

Gast #2055688
Lesenswert?
• ▲
▼
Hallo

ich könnte zwei Tipps gebrauchen. Sobald man ins ISR springt ist Bit8 
immer auf LOW. Wieso?

Ein Fehler tritt auch beim << auf. Wie kann ich die hinteren Stellen 
wieder auf 1 setzen?
1
int main (void)
2
{
3
  DDRB = 0xFF;
4
  PORTB = 0xFF;
5
  
6

7
  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
8
  TCCR1B |= (1<<WGM12) | (1<<CS12);
9
  TIMSK1 |= (1<<OCIE1A);
10

11
  OCR1A = 1952;
12

13
  sei();
14
    
15

16
  while(1)
17
  {}
18
}
19

20

21
ISR(TIMER1_COMPA_vect)
22
{
23
  PORTB = PORTB<<1;
24
}
Gast #2055704
Lesenswert?
• ▲
▼
> Sobald man ins ISR springt ist Bit8 immer auf LOW. Wieso?

Bit8 von was?

> Ein Fehler tritt auch beim << auf.

Welcher?

> Wie kann ich die hinteren Stellen wieder auf 1 setzen?

DazuODERn mit dem bitweisen ODER Operator |
Gast #2056725
Lesenswert?
• ▲
▼
Das ist mir klar

Wenn ich aber 1111 1110 shiften will, wie kann ich wieder die hinteren 
Stellen mit 1 auffüllen.

1111 1110
1111 1101
1111 1011

Bei mir ist auch das Problem, wenn der Debugger das erste mal ins ISR 
springt ist die erste Stelle immer 0 obwohl ganz am Anfang  PORTB = 
0xFF;
steht.

0111 1111
Gast #2056786
Lesenswert?
• ▲
▼
> Wenn ich aber 1111 1110 shiften will, wie kann ich wieder die hinteren
> Stellen mit 1 auffüllen.
>
> 1111 1110
> 1111 1101
> 1111 1011
1
ISR(TIMER1_COMPA_vect)
2
{
3
  uint8_t carry;
4
  uint8_t tmp;
5
  tmp = PORTB;
6
  carry = tmp>>7;
7
  tmp <<= 1;
8
  tmp |= carry;
9
  PORTB = tmp;
10
}
Gast #2056879
Lesenswert?
• ▲
▼
Der Fehler ist, jedesmal wenn es ins ISR springt wird Bit8 von PortB=0
0111 1110

Wenn es in die while-Schleife kommt wird es wieder 1111 1101 und bei 
nächsten ISR wieder 0111 1011

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdbool.h>
4

5

6

7
bool bedingung;
8

9
int main (void)
10
{
11
  DDRB = 0xFF;
12
  PORTB = 0xFF;
13
  
14

15
  PORTD = 0x04;
16
  DDRD = 0x04;
17

18
  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
19
  TCCR1B |= (1<<WGM12) | (1<<CS12);
20
  TIMSK1 |= (1<<OCIE1A);
21

22
  OCR1A = 1952;
23

24
  sei();
25
    
26
  PORTB = 0xFE;
27

28
  while(1)
29
  {
30
    if (bedingung == true)
31
    {
32
      PORTB = (PORTB<<1) | 1;
33

34
      if(PORTB == 0xF7)
35
      {
36
        PORTB = 0xFE;
37
      }
38

39
      bedingung = false;
40
    }
41
  }
42
}
43

44
ISR(TIMER1_COMPA_vect)
45
{
46
  bedingung = true;
47
}
Gast #2057004
Lesenswert?
• ▲
▼
>  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
>  TCCR1B |= (1<<WGM12) | ...

Sieh nach: Welchen Effekt haben diese Konfigurationsbits?

Haben die bei deinem mir unbekannten AVR eine Auswirkung auf den Pin PB7 
- Hardware-PWM vielleicht, die den Pin toggelt?
Gast #2057211
Lesenswert?
• ▲
▼
>(Output Compare and PWM Output A for Timer/Counter0, Output
>Compare and PWM Output C for Timer/Counter1 or Pin Change Interrupt 7)

Es ist Output Compare and PWM Output C for Timer/Counter1. Es ist für 
Output C ich benütze aber Output A.

Was mich noch interessieren würde, kann man Timer und PWM auf 
Timer/Counter1 gleichzeitig benützen?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.