Forum: Mikrocontroller und Digitale Elektronik Zwei Programm auf einem Atmega8 - Problem


von Zippo (Gast)


Lesenswert?

Hallo Leute,

ich habe ein kleines Problem mit zwei kleinen Programmen auf einem 
Atmega 8.
Es geht um eine Comming Home Funktion und eine Innerraumlichtdimmung 
fürs Auto.

Ich habe dafür jeweils ein Programm geschrieben. Erst das eine auf den 
µC geflasht, getestet auf dem Steckbrett --> geht.
Dann das andere geschrieben, wieder getestet --> geht.

Jetzt möchte ich beide Programme auf einen µC machen und muss 
feststellen, das es überhaupt nicht funktioniert.
Bin so vorgegangen:

Standartzeugs (crystal, ....)
Defintionen der Parameter (habe darauf geachtet, das keine der beiden 
Programme ein Pin benutzt, welcher von dem anderen Programm gebraucht 
wird.)
Do
Programm 1

Programm 2

Loop
End
--> geht nicht

Habe es dann mit dem Debounce Befehl probiert.

Standartzeugs
Definitionen
Do
Debounce , 1 , Comminghome , Sub
Debounce , 1 , Dimmer, Sub
Loop
End

Comminghome:
Programm 1
Return

Dimmer:
Programm 2
Return

--> funktioniert ebenfalls nicht.

Was habe ich da falsch gemacht?

Danke für eure Bemühungen.

von Grrrr (Gast)


Lesenswert?

Zippo schrieb:
> (habe darauf geachtet, das keine der beiden
> Programme ein Pin benutzt, welcher von dem anderen Programm gebraucht
> wird.)

Das einfachste wäre wenn die beiden "Programme" überhaupt keine 
gemeinsamen Variablen oder uC-Resourcen benutzen.

Die Kristallkugel (sie ist wieder zurück vom polieren) sagt: Zeile 42. 
Ist immer eine bischen zu Sarkasmus geneigt, das dumme Ding. ;-)

von Zippo (Gast)


Lesenswert?

Hallo,
danke für deine schnelle Antwort.
Grrrr schrieb:
> Das einfachste wäre wenn die beiden "Programme" überhaupt keine
> gemeinsamen Variablen oder uC-Resourcen benutzen.

ja das wäre wirklich das einfachste, geht aber leider nicht.

Grrrr schrieb:
> Die Kristallkugel (sie ist wieder zurück vom polieren) sagt: Zeile 42.
> Ist immer eine bischen zu Sarkasmus geneigt, das dumme Ding. ;-)

Was meinst du mit Zeile 42? Auf welche Zeile bezieht sich der Sarkasmus 
deiner Kugel :-) ? Ich weiß ja nicht wo du angefangen hast zu zählen, 
oder was du alle mitgezählt hast.

von AVRuser (Gast)


Lesenswert?

Hallo,

ohne etwas mehr (genaueren) Code wird kaum eine Diagnose möglich sein. 
Poste mal den kompletten Code (bzw. beide Codes).
Und bitte als Datei-Anhänge ...

von Grrrr (Gast)


Lesenswert?

Zippo schrieb:
> ja das wäre wirklich das einfachste, geht aber leider nicht.

Dann ist es wahrscheinlich, das sich die beiden in's Gehege kommen. 
Untersuch doch mal, was konkret schiefläuft.

> Was meinst du mit Zeile 42? Auf welche Zeile bezieht sich der Sarkasmus
> deiner Kugel :-)

Auf Zeile 42.

> Ich weiß ja nicht wo du angefangen hast zu zählen,
> oder was du alle mitgezählt hast.

Das Übliche. Man fängt oben an. Die erste Zeile ist die Nummer 1. Dann 
bei jedem Zeilenvorschub eins addieren.

Das soll heissen, dass Du den Quellcode posten sollst, Mensch. ;-)

von Grrrr (Gast)


Lesenswert?


von Zippo (Gast)


Angehängte Dateien:

Lesenswert?

Hier sind die beiden Codes.

von Zippo (Gast)


Lesenswert?

Grrrr schrieb:
> Das soll heissen, dass Du den Quellcode posten sollst, Mensch. ;-)
^^, ja hab das etwas spät gecheckt.

von Grrrr (Gast)


Lesenswert?

Zippo schrieb:
> Hier sind die beiden Codes.
Seufz.

Poste den Code der nicht funktioniert! Du sagst ja selbst, das die 
einzelnen Programme funktionieren, die Vereinigung der Codes aber nicht 
funktioniert.

Du hast z.B. zwei Endlosschleifen in den einzelnen Codes. Wie hast Du 
die verändert damit auch die jeweils andere Schleife mal drankommt?

von Zippo (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, hab den vergessen.

von Grrrr (Gast)


Lesenswert?

Zwei Labels hintereinander ohne Return dazwischen. Dahinter Code der nie 
drankommt!

von Zippo (Gast)


Lesenswert?

Grrrr schrieb:
> Zwei Labels hintereinander ohne Return dazwischen. Dahinter Code der nie
> drankommt!

Ok, aber was heißt das jetzt konkret für mich?
Ich habe doch zwei Returns zwischen drin, hinter jeder Subroutine eins. 
Was muss ich ändern damit beide Codes ohne gegenseitige Behinderungen 
laufen?

von AVRuser (Gast)


Lesenswert?

> Ich habe doch zwei Returns zwischen drin, hinter jeder Subroutine eins.

Die Sub "Ch" hat kein 'Return' ...

von Grrrr (Gast)


Lesenswert?

Zippo schrieb:
> Ich habe doch zwei Returns zwischen drin

Die Anzahl alleine machts nicht.

Zippo schrieb:
> hinter jeder Subroutine eins.

Umgekehrt wird ein Schuh daraus. Die Subroutine endet da wo das Return 
steht.

Du hast eine Folge von:

Label1

Label2

return

blabla

return

Überleg mal welches Return ausgeführt wird, wenn Du gosub Label1 und 
gosub Label2 ausführst.

von Grrrr (Gast)


Lesenswert?

Grrrr schrieb:
> Überleg mal welches Return ausgeführt wird, wenn Du gosub Label1 und
> gosub Label2 ausführst.

Die korrekte Antwort lautet: Ach je! Kaum macht man's richtig, geht's. 
;-)

von Zippo (Gast)


Lesenswert?

Grrrr schrieb:
> Überleg mal welches Return ausgeführt wird, wenn Du gosub Label1 und
> gosub Label2 ausführst.

Ok, das ist die Theorie. Ich habe jetzt hinter jede Subroutine ein 
Return geschrieben. Aber es passiert absolut nicht das, was eigentlich 
passieren sollte. Ich steh komplett auf dem Schlauch. Wie würdest du 
denn das Programm schreben? Es stehen dir ja beide Programme zur 
Verfügung, die ich laufen lassen will. Wie würdest du daraus jetzt ein 
ganzes machen? Eventuell könntest du es posten, mir fällt sowas immer 
leichter wenn ich es vor mir sehe. Ich wäre dir dafür echt dankbar. Habe 
es gerade nochmal probiert, mit den Returns an anderer Stelle, aber 
leider auch ohne Erfolg.

von AVRuser (Gast)


Lesenswert?

Zippo schrieb:

> Aber es passiert absolut nicht das, was eigentlich passieren sollte.

Dann sage mal genau, was PASSIEREN SOLL (das konnte ich in keinem Post 
finden) und was bei dir PASSIERT. Dann kann man sich auch ein Bild davon 
machen (und die Funktion der Software überprüfen).

von Grrrr (Gast)


Lesenswert?

Zippo schrieb:
> Ok, das ist die Theorie.

Mit eminenten Auswirkungen auf die Praxis.

> Ich habe jetzt hinter jede Subroutine ein
> Return geschrieben.

Und wie sieht der Code jetzt aus? Was passiert?

Zippo schrieb:
> aber
> leider auch ohne Erfolg.

Du musst schon selbst das Problem analysieren. Wir helfen Dir hier Dir 
selbst zu helfen.

Ansonsten kannst Du mich für 60€/Stunde "mieten".

von Zippo (Gast)


Lesenswert?

AVRuser schrieb:
> Dann sage mal genau, was PASSIEREN SOLL

Es sollen nur Programm 1 und Programm 2 laufen und auf Zustansänderungen 
an den Eingängen PINB.0 und PIND.7 reagieren. Der Wert W kommt von einem 
Fotowiderstand via ADC eingelesen. Die Lichter des Autos sollen ja nur 
angehen, wenn es draußen dunkel ist.

Mit dem aktuellen Code, gehen beide LEDs an, bleiben an, egal was man an 
den Eingängen passiert.

von Grrrr (Gast)


Lesenswert?

Zippo schrieb:
> Es sollen nur Programm 1 und Programm 2 laufen und auf Zustansänderungen
> an den Eingängen PINB.0 und PIND.7 reagieren. Der Wert W kommt von einem
> Fotowiderstand via ADC eingelesen. Die Lichter des Autos sollen ja nur
> angehen, wenn es draußen dunkel ist.

Gut. Jetzt noch eine Beschreibung auf welche Weise jede Zeile des 
Programmes das erreichen soll.

von Zippo (Gast)


Angehängte Dateien:

Lesenswert?

Grrrr schrieb:
> Gut. Jetzt noch eine Beschreibung auf welche Weise jede Zeile des


Genau jetzt klemmts bei mir.
Wie meisnt du das mit "jede Zeile"? Ich sehe die beiden einzelnen 
Programme nicht als Zeilen, sondern jedes Programm als eine Einheit.

Im aktuellen Code soll das Hauptprogramm die beiden Eingänge abfragen 
und die Subroutinen abrufen und ablaufen lassen.

von cvnc (Gast)


Lesenswert?

Dann setz Dich zur Hoelle hin und versuche, nachzuvollziehen, was dein 
Programm macht. Zeile fuer Zeile. Wenn Du das nicht hinkriegst, musst Du 
halt jemanden bezahlen, der es macht.

Gast

von Zippo (Gast)


Lesenswert?

cvnc schrieb:
> Dann setz Dich zur Hoelle hin und versuche, nachzuvollziehen, was dein
> Programm macht. Zeile fuer Zeile. Wenn Du das nicht hinkriegst, musst Du
> halt jemanden bezahlen, der es macht.

Ich denke nicht das solche Antworten Sinn eines Forums sind.
Wenn du etwas zu besten geben willst, dann doch bitte etwas was 
weiterhilft.
Wenn du das nicht kannst, dann lies aufmerksam mit und lerne.

von Grrrr (Gast)


Lesenswert?

Die Frage ist einfach: Was heist es wenn Du sagst, es geht nicht!

Das überprüfst Du dann anhand dessen was Du annimmst, was geschehen 
soll. Dein Design.

Das Design überprüfst Du dann anhand dessen was Du geschrieben hast. 
Dein Programmcode.

Ob Du Deine Zeilen jetzt als ein Programm betrachtest oder nicht ist dem 
Compiler und der Realität völig wurscht.

Du solltest Dich nach dem richten was "ist" und nicht nach dem "wie Du 
es gerne hättest". Das nennt man Wertestarrheit und ist ein Problem mit 
dem alle Programmierer mehr oder weniger zu kämpfen haben. Es blockiert 
einen nämlich bei der Lösungsfindung.

Diese Hürde musst Du überspringen oder umgehen oder in die Luft sprengen 
oder Du kannst das programmieren gleich ganz sein lassen. Im täglichen 
Leben allerdings taucht das Problem auch auf.

Wir lassen es einfach nicht zu, das Du Probleme die Du nicht lösen 
kannst, auf andere abwälzt. Wir helfen Dir hier freiwillig und 
kostenlos. Aber Hilfe heisst nicht das wir "es" für Dich tun, sondern 
das wir Dir helfen es selbst zu tun.

Und jetzt halte ich mich raus.

von Dr.PillePalle (Gast)


Lesenswert?

moin

Du hast den Stack nicht definiert , sollte man schleunigst nachholen.

$regfile = "m8def.dat"
$crystal = 10000000
$hwstack = 64
$swstack = 64
$framesize = 64

Und vielleicht mal die Hilfe von Bascom bemühen :-)
auf der Website von MCS gibts auf alle Fragen eine Antwort .....

mfg

von Paul Baumann (Gast)


Lesenswert?

Setze mal diese Zeilen rein:
Debounce Pind.7 , 0 , Ch , Sub
Debounce Pinb.0 , 0 , Pwm , Sub

Wenn Du in die Tasten haust, springt er zur jeweiligen Subroutine.

MfG Paul

von Georg W. (gewe)


Lesenswert?

Ich würde mal sagen, "ch" und "pwm" müssen immer, d.h. ohne debounce 
aufgerufen werden.

Wenigstens wird in "pwm" Pinb.0 auf 0 und auf 1 abgefragt.

cu
Georg

von Karl H. (kbuchegg)


Lesenswert?

Auch ist die Idee des
'Ich habe da ein Programm A geschrieben und ich habe ein Programm B 
geschrieben und jetzt klotz ich die irgendwie in ein gemeinsames 
Programm' nicht zielführend.

Du hast ein Programm A geschrieben. Gut.
Das basiert auf einer Idee, einer Vorgehensweise wie ein bestimmtes 
Problem gelöst wird.
Weiters hast du ein anderes Programm B geschrieben.
Auch das basiert auf einer Idee.

Was du tun musst: Du musst ein Programm C schreiben, bei dem du die Idee 
aus A und B in ein neues gemeinsames Programm integrierst. Du übernimmst 
also nicht direkt einfach nur den Programmcode von A und B in einer 1:1 
Manier, sondern du musst die beiden Programmideen in ein Programm 
zusammenführen. Natürgemäss werden dabei wesentliche Teile in C wie der 
Code in A oder B aussehen. Aber das hat keine Proiorität! Es ist nicht 
wichtig, dass der Code 100% identisch ist. Es ist nur wichtig, dass du 
die Programmideen zusammenführst. Und egal welche Anpassungen dazu 
notwendig sind, sie sind notwendig.

Eine Aussage, wie die hier:

>> Das einfachste wäre wenn die beiden "Programme" überhaupt keine
>> gemeinsamen Variablen oder uC-Resourcen benutzen.
>
> ja das wäre wirklich das einfachste, geht aber leider nicht.

muss für dich völlig inakzeptabel sein. Wenn Anpassungen notwendig sind, 
dann sind sie notwendig. Wenn, abgesehen vom Kern der die Idee 
implementiert, das Drumherum geändert werden muss, dann muss es geändert 
werden.

Kleb nicht daran, dass du einfach 2 beliebige Programme in eine 
gemeinsame Datei kopieren kannst, noch ein wenig Drumherum und schon 
funktioniert alles. Das tut es nämlich nicht! Genau das hast du jetzt am 
eigenen Leib erfahren.

Die beste Strategie besteht darin, sich daran zu erinner, welche Idee im 
Code A steckt, welche Idee hinter Code B steckt, zu rekapitulieren wie 
das alles realisiert wurde und dann A und B beiseite zu legen und mit 
einem Programm C anzufangen, welches ein komplett neues Programm 
darstellt. Da du A und B selber geschrieben hast und die Idee dahinter 
auch noch kennst, geht das ruckzuck, sobald du weißt wie du beide Ideen 
in einem Programm unter einen Hut bringen kannst.

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.