mikrocontroller.net

Forum: Compiler & IDEs Probleme mit ISR


Autor: gccc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
int main (void)
{
  DDRB = 0xFF;
  PORTB = 0xFF;
  

  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
  TCCR1B |= (1<<WGM12) | (1<<CS12);
  TIMSK1 |= (1<<OCIE1A);

  OCR1A = 1952;

  sei();
    

  while(1)
  {}
}


ISR(TIMER1_COMPA_vect)
{
  PORTB = PORTB<<1;
}

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 |

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist kein Fehler, das gehört so! Leere Stellen beim Bitshiften werden 
mit Nullen auf gefüllt!

Autor: gccc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gccc schrieb:
> Wenn ich aber 1111 1110 shiften will, wie kann ich wieder die hinteren
> Stellen mit 1 auffüllen.

| 1 ?
also einfach:
PORTB = (PORTB<<1) | 1;

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
ISR(TIMER1_COMPA_vect)
{
  uint8_t carry;
  uint8_t tmp;
  tmp = PORTB;
  carry = tmp>>7;
  tmp <<= 1;
  tmp |= carry;
  PORTB = tmp;
}

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1111 1110
> 1111 1101
> 1111 1011
  1111 0111
  1110 1111
  1101 1111
  1011 1111
  0111 1111 <===
  1111 1110 <===
  ...

Autor: gccc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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



bool bedingung;

int main (void)
{
  DDRB = 0xFF;
  PORTB = 0xFF;
  

  PORTD = 0x04;
  DDRD = 0x04;

  TCCR1A |= (0<<COM1A1) | (1<<COM1A1);
  TCCR1B |= (1<<WGM12) | (1<<CS12);
  TIMSK1 |= (1<<OCIE1A);

  OCR1A = 1952;

  sei();
    
  PORTB = 0xFE;

  while(1)
  {
    if (bedingung == true)
    {
      PORTB = (PORTB<<1) | 1;

      if(PORTB == 0xF7)
      {
        PORTB = 0xFE;
      }

      bedingung = false;
    }
  }
}

ISR(TIMER1_COMPA_vect)
{
  bedingung = true;
}

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informiere dich über das fehlende Schlüsselwort volatile bei der 
Definition von bool bedingung;

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gccc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.