mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Komisches Problem mit Portansprechung


Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier ein ganz doofes Problem im Grunde, und komme nicht 
dahinter was dies sein könnte, mein Programm mit dem ich einen Timer 
anspreche und LED's blinken lasse.:
const char _THRESHOLD = 64;
int counter = 0;

int flash_ps = 8;

int counter_small = 0;
int site = 1;

void Timer2Overflow_ISR() org IVT_ADDR_TIMER2_OVF {

  if (site == 1)
           {
           
           if (counter_small >= flash_ps)
                       {
                       PORTD = ~PORTD;
                       counter_small = 0;
                       }
           else
                       {
                       counter_small++;
                       }
           
           if (counter >= _THRESHOLD)
                       {
                       PORTD = 0;
                       counter = 0;
                       site = 2;
                       }
           else
                       {
                       counter++;
                       }
           }
  
  if (site == 2)
           {

           if (counter_small >= flash_ps)
                       {
                       PORTA = ~PORTA;
                       counter_small = 0;
                       }
           else
                       {
                       counter_small++;
                       }

           if (counter >= _THRESHOLD)
                       {
                       PORTA = 0;
                       counter = 0;
                       site = 1;
                       }
           else
                       {
                       counter++;
                       }
           }
  
}

void main() {

  delay_ms(2000);

  DDRD   = 0xff;
  DDRA   = 0xff;

  PORTA  = 0xaa;
  PORTD  = 0xaa;

  SREG_I_bit = 1;               // Interrupt einschalten
  TOIE2_bit  = 1;               // Timer2 overflow interrupt einschalten

  delay_ms(2000);
  
  TCCR2  = 7;                    // Start timer mit 1024 prescaler
  
  delay_ms(100);
  while (1);
}

So wie es dort steht, werden folgende Ports angesprochen:

4x PortA blinkt
...
4x PortD UND PortC blinkt

So und warum blinkt nun PortC bei PortD mit?!? Ich komme echt nicht 
dahint, wenn ich nun aber explizit angebe:
...
  DDRC   = 0xff;
  DDRD   = 0xff;
  DDRA   = 0xff;

  PORTA  = 0xaa;
  PORTD  = 0xaa;
  PORTC  = 0x00;
...

dann blinkt PortC nicht mit.

Aber warum ist das so?! Ich kann echt beim besten Willen kein Fehler in 
meinem Code feststellen?!

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja...

µC ist ein ATmega16 - 16PU auf einem EasyAVR6 Testboard.

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit "Strickung" oder "Kochung" als Hobby?

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist PORTD als "int" definiert?
ich würde mir mal den Assembler-Code anzeigen lassen.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also n timer interrupt sieht eigentlich so aus:

ISR(SIG_OVERFLOW0)
{
...
}

das
org IVT_ADDR_TIMER2_OVF ...
ist falsch. (so was macht man in assembler mit einem Sprungbefehl, aber 
keine ganze Codesammlung)


siehe: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Du benötigst außerdem <avr/interrupts.h>

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-.-

Lieber Gast "Naja"... mir ist durchaus bewußt das du mir in den 
Bereichen Stricken und Kochen weiter helfen könntest als sonst jemand 
anderes hier im Forum. Dennoch muß ich dein Angebot ablehnen dir deinem 
wunderschönen Hobby zu folgen. Ich kann dich auch leider nicht mit zum 
Ballett-Unterricht begleiten.

back to topic:

Ich habe nun das Problem ausfindig gemacht. Bei Rücksetzen der Ports A 
und D habe ich folgenden Fehler begangen:
...
PORTD = 0;
...

hab es nun natürlich zu folgendem geändert und es funktioniert tadellos:
...
PORTD = 0x00;
...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei dann
PORTD = 0;
in jeder Hinsicht vollkommen äquivalent ist zu
PORTD = 0x00;

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Grunde schon, aber der Fehler ist reproduzierbar :/

Genau das gleiche mit den Interrupts, was Flo angesprochen hat. Ich 
programmiere mit MicroC. Welche unter anderem keine Signal.h oder ebend 
die Interrupt.h mitliefert. Oder wie ebend das Problem mit den Hex 
werten.

Ich werde mal AVR-GCC anschauen, da scheint es mitunter leichter von der 
Hand zu gehen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind alle übrigen Verbindungen des Board an Port C abgeschaltet, 
beispielsweise die Pullups/downs der Tastatur?

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Sind alle übrigen Verbindungen des Board an Port C abgeschaltet,
>
> beispielsweise die Pullups/downs der Tastatur?


Jep, das ist in solchen Fällen immer der erste Blick über das Brett :D

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Lieber Gast "Naja"... mir ist durchaus bewußt das du mir in den
>Bereichen Stricken und Kochen weiter helfen könntest als sonst jemand
>anderes hier im Forum. Dennoch muß ich dein Angebot ablehnen dir deinem
>wunderschönen Hobby zu folgen. Ich kann dich auch leider nicht mit zum
>Ballett-Unterricht begleiten.

Schon klar, Draco. ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Draco schrieb:
>
> ...
> PORTD = 0;
> ...
> 
>
> hab es nun natürlich zu folgendem geändert und es funktioniert tadellos:
>
>
> ...
> PORTD = 0x00;
> ...
> 

Was ist denn daran natürlich?

Du ersetzt einen C-Ausdruck durch einen vollkommen gleichwertigen und 
Dein Compiler reagiert anders?
Dann solltest Du einen Bugreport an den Compilerhersteller schicken, 
sowas darf ein Compiler nämlich nicht!
Denn dieser Bug wird Dir wieder und wieder Sorgen bereiten.

Ein Compiler muß Zahlen immer genau gleich bewerten, völlig egal, ob du 
sie dezimal, oktal, hexadezimal oder ASCII '\0' hinschreibst.


Peter

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.