mikrocontroller.net

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


Autor: Zippo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Zippo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Zippo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier sind die beiden Codes.

Autor: Zippo (Gast)
Datum:

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

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Zippo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab den vergessen.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwei Labels hintereinander ohne Return dazwischen. Dahinter Code der nie 
drankommt!

Autor: Zippo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe doch zwei Returns zwischen drin, hinter jeder Subroutine eins.

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

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. 
;-)

Autor: Zippo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Zippo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zippo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: cvnc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zippo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dr.PillePalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Georg W. (gewe)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.