mikrocontroller.net

Forum: Compiler & IDEs Probleme mit C Code


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich verstehs echt nicht mehr ...

Ich habe folgenden Code:

#include <avr/io.h>
#include <avr/interrupt.h>    // sei()
#include <avr/signal.h>      // SIGNAL

#define XTAL 1000000

int main(void) {
  /* configure all portD bits as input */
  DDRD = 0x00;
  // configure all PortB bits as output
  DDRC = 0xff;
  PORTC = 0xff;

  //sei();
  while(1);
  return 0;
}

SIGNAL (SIG_INTERRUPT0) {
  PORTB = 0xff;
}

Nun sollte doch nachdem ich den AVR mittels winavr/avrdude programmiert
habe, der Port C auf High Pegel sein .. oder ?

Interessanterweise ist er das aber nicht .. weiss vielleicht jemand was
ich falsch mache ?

Autor: Elektrikser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher AVR?
Atmega 16,32,...
JTAG (Schau mal in den Fuses) aktiv?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh :)

es handelt sich um einen vollkommen neuen Atmega8.

Das erste Problem konnte ich lösen ... wahrscheinlich hatte der
programmer was ... denn obwohl avrdude meinte "successful" hab ichs
mal mit meinem anderen adapter und ponyprog probiert und siehe da, es
ging ...

aber jetzt funktioniert noch die sache mit dem interrupt nicht .. ich
schau wohl nochmal schnell ins tutorial hier :)

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jaja .. man sollte den externen IRQ halt auch richtig aktivieren seufz

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> denn obwohl avrdude meinte "successful" hab ichs
> mal mit meinem anderen adapter und ponyprog probiert und siehe da,
> es ging ...

Du solltest nach jedem Brennvorgang die geschriebenen Daten
verifizieren.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm . .tut das avrdude nicht von haus aus ?
könnte schwören dass dort was mit Verifying stand.

zurück zu meinem jetzigen Problem:

Ich würde gerne einen externen Interrupt nutzen, habe aber das Problem,
dass er anscheinend nicht wirklich ausgelöst wird. Weiss zufällig jemand
woran das liegen könnte ? Die Initialisierung müsste ja so passen, oder
?

int main(void) {
  /* configure all portD bits as input */
  DDRD = 0x00;
  // configure all PortB bits as output
  DDRC = 0xff;
  PORTC = 0x00;

  //configure the external interrupt
  GICR |= (1<<INT0);
  MCUCR &= ~(1<<ISC01);
  MCUCR |= (1<<ISC00);


  // enable interrupts
  sei();
  while(1);
  return 0;
}

SIGNAL (SIG_INTERRUPT0) {
  PORTC = 0xff;
}

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grmml .. dummer verdrahtungsfehler wies scheint .. :)

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt wohl doch ein problem :(

ich nutze jetzt den PORTB (war mit PORTC auch net anders).

es kommt mir vor, als würde sofort nach dem Einschalten ein IRQ
auftreten, und auch danach in sehr kurzen abständen (10ms?).
Ich habe eine LED angehängt und die scheint zeitweise zu flackern (für
ein paar Sekunden) dann leuchtet sie wieder durchgehend (auch wieder
ein paar Sekunden).

der Code ist folgender:
#include <avr/io.h>
#include <avr/interrupt.h>    // sei()
#include <avr/signal.h>      // SIGNAL

#define XTAL 1000000

int ab = 0x00;

int main(void) {

  // configure all PortB bits as output
  DDRB = 0xff;
  PORTB = 0x00;

  //configure the external interrupt
  GICR |= (1<<INT0);
  MCUCR |= (1<<ISC00) | (1<<ISC01);


  // enable interrupts
  sei();
  while(1);
  return 0;
}

SIGNAL (SIG_INTERRUPT0) {
  if (ab == 0x00)
  {
    PORTB = 0xff;
    ab = 0xff;
  }
  else
  {
    PORTB = 0x00;
    ab = 0x00;
  }
}

Nun zur eigentlichen Frage: warum ist das so? Ein IRQ sollte doch erst
bei Überschreiten eines gewissen Pegels auftreten .. oder?  - Mein
Multimeter zeigt eigentlich schöne 0,00V (Low) und 4,3V (High) an.
Das Ganze hängt an einem FT245 - kann hier das Problem liegen?

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe heute an einem aehnlichen Problem gearbeitet. Bei mir laeuft es
jetzt.

Ich verstehe diesen Teil Deines Programms nicht:
  //configure the external interrupt
  GICR |= (1<<INT0);
  MCUCR |= (1<<ISC00) | (1<<ISC01);

Ich weiss nicht, was Du z.B. mit 1<<INT0 machst.

Bei mir sieht das so aus und es funktioniert:

// Konfiguration des Interrupts
// Der externe Interrupt INT0 liegt an PD2 (Pin4 des Atmega8)
// INT0 soll bei fallender Flanke ausloesen, weil an Pin4 ein Pullup-
// widerstand nach Vdd und ein Taster nach GND geschaltet sind.
MCUCR = 0x02 ;
// INT0 aktivieren
GIMSK = 0b01000000 ;

// PD2 of Datadirection Register D to input
DDRD = 0b11111011 ;

Ich habe das ganze aber nur auf dem Simulator getestet, da ich noch
keine Hardware habe.

Autor: edvdoctor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bei Deinem Code sollte eigentlich bei einer steigenden Flanke an
INT0 ein Interrupt ausgelöst werden. Vielleicht ist das Signal nicht
sauber, oder der USB-Chip gibt tatsächlich diese INT-Signale aus.

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.