Variable wird beim Interrupt nicht hochgezählt Fehler

Gast #3281696
Hallo Leute

ich habe ein Problem mit einer Variable die ich in einem Interrupt 
hochzählen will bekomme aber immer dieser Fehler

"error: 'muh' was not declared in this scope"

vielleicht findet ihr ihn ja

Gruß Uwe


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


ISR (TIMER0_COMPA_vect)
{
  PORTD = 0b00000000;
  muh ++;
}

int main()
{
DDRB = 0b00000000;

DDRD = 0b00000111;
PORTD = 0b00000111;

ADCSRA = (1<<ADEN) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADMUX = (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0) | (1<<REFS0) | 
(0<<REFS1);
ADC = (0<<ADLAR);


TCCR0A = (0<<WGM02) | (1<<WGM01) | (0<<WGM00); // CTC Modus
TCCR0B = (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler 1024
OCR0A = 124; //Oberes Ende für Interupt
TIMSK0 = (1<<OCIE0A);

uint16_t result;

uint8_t Eingang_B0;

uint8_t Zahl;

volatile uint8_t muh;

bool Blockieren = 0;

sei(); // Global Interrupts aktivieren

  while(1)
  {
    Zahl = muh;
    Eingang_B0 = PINB;
    Eingang_B0 = Eingang_B0 & 0x01;
#3281714
Uwe schrieb:
> Hallo Leute
>
> ich habe ein Problem mit einer Variable die ich in einem Interrupt
> hochzählen will bekomme aber immer dieser Fehler
>
> "error: 'muh' was not declared in this scope"
>
> vielleicht findet ihr ihn ja
>
> Gruß Uwe
>
>
> #include <avr/io.h>
> #include <stdint.h>
> #include <avr/interrupt.h>
>
>
> ISR (TIMER0_COMPA_vect)
> {
>   PORTD = 0b00000000;
>   muh ++;
> }
>
> volatile uint8_t muh;
>

Die Variable muss vor der Benutzung deklariert werden. Oder darf erst 
nach der Deklaration benutzt werden. Deklariere die Variable vor der ISR 
oder stell die ISR dahinter. Kannst du dir aussuchen.

mfg.
Gast #3281717
Hallo Thomas,

Danke für die Antwort ich hatte die ISR allerdings zum Anfang am ende 
des Programms stehen und so hatte es auch nicht Funktioniert erst das 
verschieben der Variablen muh hinter das Include hatte Erfolg mit sich 
gebracht
Gast #3281739
Uwe schrieb:
> Danke für die Antwort...

Und?

Mal im Ernst: Warum weißt du sowas nicht? Eigentlich sollte es doch 
selbstverständlich sein, daß man sich erstmal kundig macht über eine 
Programmiersprache, bevor man sie verwendet. Also zuvor ein passendes 
Buch lesen - und wenn man schon aus unangemessener Ahnungslosigkeit auf 
die Nase fällt, dann sollte man wenigstens nicht zu bequem sein, die 
Fehlermeldung des Compilers selbst zu lesen, anstatt selbige zu posten

"error: 'muh' was not declared in this scope"

und herumzufragen, ob sich jemand findet, der einen an die Hand nimmt.

Ich frag dich mal, wie du es dir vorstellst, wie es weiter gehen soll in 
deinem Leben. Irgendwann wirst du bei Strafe deines Unterganges 
gezwungen sein, auf deinen eigenen Beinen zu stehen und deine Probleme 
selbst zu lösen - insbesondere dann, wenn so ein Problem so einfach ist 
und man dessen Lösung bereits ausgedruckt bekommen hat. Jim Meba war 
genervt von dir und hat deinen Zustand richtig erkannt - und hat dir den 
einzig richtigen Tip gegeben, nämlich dich zu belesen. Das kann ich hier 
nur wiederholen.

Das Feld der Programmiererei ist SEHR VIEL weiter und größer als nur 
die richtige Stellung von Identifiern zu ihrer Verwendung zu beachten. 
Also schreib mal, wie du dir das Ganze eigentlich vorstellst.

W.S.
Gast #3281744
> ... ich hatte die ISR allerdings zum Anfang am ende
> des Programms stehen und so hatte es auch nicht Funktioniert erst das
> verschieben der Variablen muh hinter das Include hatte Erfolg mit sich
> gebracht

Nicht das Du die falschen Schlüsse daraush ziehst:

Entscheidend ist nicht, ob die Variable unmittelbar hinter den Includes 
steht.

Vielmehr, ist entscheidend, dass die Variable vor jeder Funktion steht, 
welche diese Variable verwendet.
Falls Du, im übrigen, die ISR einmal am Ende der Datei stehen hattest, 
und dies (abgesehen von den Includ-Dateien) die einzige Datei des 
Programmes war, dann hätte es gehen müssen . Da muss also was anderes 
die Ursache gewesen sein.
Gast #3281755
Tue Dir mal einen Gefallen und lerne ordentliche Programmierung.
Am sinnvollsten ist es für Deine globalen Variablen ein eigenes 
Includefile zu erzeugen das dann überall eingebunden wird.
#3281759
Hmm schrieb:
>> ... ich hatte die ISR allerdings zum Anfang am ende
...
> Vielmehr, ist entscheidend, dass die Variable vor jeder Funktion steht,
> welche diese Variable verwendet.
> Falls Du, im übrigen, die ISR einmal am Ende der Datei stehen hattest,
> und dies (abgesehen von den Includ-Dateien) die einzige Datei des
> Programmes war, dann hätte es gehen müssen . Da muss also was anderes
> die Ursache gewesen sein.

Wenn Ich mir den gepusteten Originalcode anschaue, dann ist muh, lokal 
in der Main-Routine und nicht global ( wenn Ich richtig sehe). Wenn dem 
so ist, dann kann doch die ISR die Variable nicht kennen, sondern ist 
nur für alle innerhalb main() sichtbar.
#3281776
> Danke für die Antwort ich hatte die ISR allerdings zum Anfang am ende
> des Programms stehen und so hatte es auch nicht Funktioniert erst das
> verschieben der Variablen muh hinter das Include hatte Erfolg mit sich
> gebracht
Du weisst zwar nicht warum, aber Hauptsache es geht jetzt.
Variablen, die von mehreren Funktionen benutzt werden, müssen nicht 
hinter den "includes" stehen, sondern global deklariert werden. Das war 
der Fehler. Deine Variablen sind aber lokal in main deklariert. was aber 
auf Grund der nicht vorhandenen Einrückung des Textes keiner, ausser 
Sebastian, sofort gesehen hat.

Ich hoffe, du verstehst diesen Fehler.

mfg.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.