Forum: Mikrocontroller und Digitale Elektronik Variable wird beim Interrupt nicht hochgezählt Fehler


von Uwe (Gast)


Lesenswert?

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;

von Marcel H. (repac3r)


Lesenswert?

Setz doch mal volatile uint8_t muh; unter den includes.

lg, repac3r

von Jim M. (turboj)


Lesenswert?

Besorge Dir erstmal ein Buch über "C". Dir fehlt wichtiges Grundwissen.

von Uwe (Gast)


Lesenswert?

Cool danke für die schnelle und HILFREICHE Antwort

so Funktioniert es

von Thomas E. (thomase)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Hmm (Gast)


Lesenswert?

> ... 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.

von cppler (Gast)


Lesenswert?

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.

von Sebastian H. (technik_freak)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

> 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.

von Uwe (Gast)


Lesenswert?

Ja habe es verstanden nochmals

DANKE

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.