Hallo,
ich möchte innerhalb einer switch case eine bestimmten Portpin (PB0 oder
PB1) solange high schalten bis ein Taster an PB3 oder PB4 gedrückt wird.
Wenn ich sc_temp=1 setze bleibt PB0 immer an, auch wenn ich den Taster
an PB3 drücke...
Wie muss ich das denn umschreiben, dass es klappt?
wenn ich sc_temp = 2 setze macht er ja die andere case, aber eigentlich
sollte die jeweilige Sache doch nur ausgeführt werden solange das in der
while Schleife wahr ist, also der Taster nicht gedrückt ist. Aber es
dreht ewig weiter.
Wenn du die Ports auf Eingang gesetzt und sonst deine Beschaltung
stimmt, tut sie das. Auch weiß man nicht wie der restliche Code
aussieht.
Das ist alles etwas wenig ohne weitere Informationen.
Ich möchte eigentlich follgendes
case1: P0 an; P1 aus bis Taster an PB3 gedrückt wird
Case2: P1 an; P0 aus bis Taster an PB2 gedrückt wird
Ein kleiner Fehler ist im quellcode. In der Case2 steht hinter der
While:
Volkmar Dierkes schrieb:> Und Du brauchst den Ausgang nur einmal vor dem Eintritt in die> While-Schleife setzen:>
1
case1:
2
>PORTB&=~(1<<PB1);
3
>PORTB|=(1<<PB0);
4
>while(!(PINB&(1<<PB3)));
5
>PORTB&=~(1<<PB0);
6
>break;
^^das schein richtig(er) zu sein als das von mir (nicht das mich das
wundert ;-))
Allerdings Leuchtet die LED mit halber stärke wenn ich den Taster
bediene und geht nicht ganz aus
Bollemx schrieb:> Hallo? sc_temp wird initialisiert und fertig. Wie soll der Code in case> 2 jemals ausgeführt werden?!?!> Hast du mal meinen Tipp oben beachtet?
^^habe ich ausprobiert, aber das LED leuchtet dabei auch mit halber
Kraft..Allerdings seltsammerweise dann wenn ich den falschen Taster
drücke
Bollemx schrieb:> Volkmar Dierkes schrieb:>> case 1:>> PORTB &= ~ (1<<PB1);>> PORTB |= (1<<PB0);>> while(!(PINB & (1<<PB3)));>> PORTB &= ~ (1<<PB0);>> break;>>> Wenn du diesen Code verwendest darfst Du hier natürlich auch nicht> vergessen wieder sc_temp = 2 einzufügen, also:>>> case 1:>> PORTB &= ~ (1<<PB1);>> PORTB |= (1<<PB0);>> while(!(PINB & (1<<PB3)));>> PORTB &= ~ (1<<PB0);> --> sc_temp = 2;>> break;>> und "sc_temp = 1;" in case 2.
^^ja, das passt... :-)
Vielen für die Geduld
Gruß Rocco
Rocco L. schrieb:> Ich möchte eigentlich follgendes> case1: P0 an; P1 aus bis Taster an PB3 gedrückt wird> Case2: P1 an; P0 aus bis Taster an PB2 gedrückt wird
Ich weiß ja nicht was an PB0 und PB1 dran hängt, eventuell mußt Du noch
darauf achten das zuerst ausgeschaltet wird und nicht beide Ausgänge
gleichzeitig an sind.
Volkmar
Habe jetzt die switch-case reingefummelt.
Leider haut trotzdem was nicht hin.
Folgender Ausgangszustand:
in w_temp sollten 36°C sein (Laut LED Anzeige)
in k_temp sollten 13°C sein
in p_temp sollten 21°C sein
Die Endanschlagtaster (Damit der Motor nicht über das Ziel hinaus fährt)
sind alle nicht gedrückt. Hier sollte eine kurze Initialisierung rein,
etwa so etwas wie fahre erst mal ins Kältebad bis der Endanschlagtaster
vom Kältebad gedrückt ist.
Wenn er dann im Kältebad ist soll er Richtung Wärmebad fahren wenn die
Probe die Temperatur vom Kältebad angenommen hat.
Dabei soll er wieder so lange bis in das Wärmebad fahren bis er den
Endanschlagtaster vom Wärmebad gedrückt hat.
Im Wärmebad dann wieder das gleiche, sobald die Temperatur der Probe mit
der vom Wärmebad übereinstimmt gehts zurück ins Kältebad und immer so
weiter.
In dem angehangenen Quelltext ist follgendes seltsamm:
Wenn ich WB (PB3) drücke Fängt der Motor an in die entgegengesetzte
Richtung mit halber Kraft zu laufen, lass ich wieder los dreht er wieder
in die Alte Richtung.
Im Quellcode habe ich in den Zeile 73..75 die Temperaturwerte
invertiert. Ich glaube das das notwendig ist weil ich die Temperatur von
den DS18S20 so über die LED ausgebe, und somit auch so an den Atmega 16
weitergebe:
1
// Temperatur in Grad Celsius:
2
3
//reset (alle LEDs aus)
4
p=0x00;
5
6
//Konfiguration der Pins für LEDs setzen
7
// (0 = LED an, 1 = LED aus)
8
if(tC>=80){p|=(1<<7);tC-=80;}//Pin7 f?r 80?C an
9
if(tC>=40){p|=(1<<6);tC-=40;}//Pin6 f?r 40?C an
10
if(tC>=20){p|=(1<<5);tC-=20;}//Pin5 f?r 20?C an
11
if(tC>=10){p|=(1<<4);tC-=10;}//Pin4 f?r 10?C an
12
if(tC>=8){p|=(1<<3);tC-=8;}//Pin3 f?r 8?C an
13
if(tC>=4){p|=(1<<2);tC-=4;}//Pin2 f?r 4?C an
14
if(tC>=2){p|=(1<<1);tC-=2;}//Pin1 f?r 2?C an
15
if(tC>=1){p|=(1<<0);tC-=1;}//Pin0 f?r 1?C an
16
17
p=~p;//notwendig damit die LED leuchten, sonst leuchten alle anderen LED
18
//p = p-0,5; //Eichung des Thermometers
19
LED_OUT=p;
Dabei steckt die Temperatur in der Variablen tC. Die Temperaturen werden
richtig angezeigt.
Ich entschuldige mich schon mal für den ^^ Roman.
ich weis halt nicht wo ich den Temperaturvergleich mit hin schreiben
soll
fahre ins Wärmebad wenn p_temp <= ktemp && bis Endanschlagtaster vom
Wärmebad gedrückt ist
fahre ins Kältebad wenn p_temp >= w_temp && bis Endanschlagtaster vom
Kältebad gedrückt ist
Hallo,
Warum der Motor mit halber Kraft läuft, sehe ich im Moment auch nicht.
Aber damit der Motor stehen bleibt, wenn er den Endanschlag erreicht
hat, mußt Du noch 2 weitere States in Deine StateMachine einfügen
(ungetestet). Momentan springt die StateMachine ja nur zwischen den 2
Zuständen Linksrum und Rechtsrum hin und her, es gibt aber keine Pause.
Lief der Motor denn überhaupt schon mit voller Geschwindigkeit? Die
Controllerausgänge können nicht viel Strom. Musst Du evtl transistoren
dranhängen und Ubat durchschalten? Mit wieviel Volt betreibst Du Den
Controller? reicht das dann für den Motor? Z.B. Controllerspg = 2,8V;
Motorspannung = 5V...???
Mach doch mal das: Schalte einfach einen Ausgang, der den motor treibt
auf "high" - ohne switch/case usw. einfach nur den Ausgang auf "High"
und dann mal schauen, wie der Motor fährt.
Oder: Mal mit dem Oszi am Ausgang messen, ob der oszilliert (falls
vorhanden)
der Motor hängt hinter einer H-Brücke.
Ich denke immer noch das was beim Temperatureinlesen schief läuft.
Die Temperatur wird ja beim Ausgeben mit p=~p; invertiert. Das muss sein
das die richtigen LED leuchten, sonst würden alle anderen LED leuchten,
bis auf die die eben leuchten sollen.
Beim Einlesen muss ich doch die Temperatur dann auch invertieren - oder?
die Motroports CW und CCW einfach so high setzen klappt einwandfrei.
In der Switch-Case sind mir nur ein paar Kleinigkeiten aufgefallen. Die
neue sieht jetzt so aus:
1
while(1){
2
if(!(PINB&(1<<KB)))
3
{
4
PORTB|=(1<<CW);
5
PORTB&=~(1<<CCW);
6
}else{
7
PORTB&=~(1<<CW);
8
PORTB&=~(1<<CCW);
9
break;
10
}
11
}//ende Initialisierungs while
12
13
switch(state){
14
caseCW_AN:
15
PORTB|=(1<<CW);
16
PORTB&=~(1<<CCW);
17
if((PINB&(1<<KB))&&!(PINB&(1<<WB)))
18
state=IM_KAELTEBAD;
19
break;
20
caseIM_KAELTEBAD:
21
// Motor anhalten
22
PORTB&=~(1<<CW);
23
PORTB&=~(1<<CCW);
24
// Temp abfragen
25
if(p_temp<=k_temp)
26
state=CCW_AN;
27
break;
28
caseCCW_AN:
29
PORTB|=(1<<CCW);
30
PORTB&=~(1<<CW);
31
if(!(PINB&(1<<KB))&&(PINB&(1<<WB)))
32
state=IM_WAERMEBAD;
33
break;
34
caseIM_WAERMEBAD:
35
// Motor anhalten
36
PORTB&=~(1<<CW);
37
PORTB&=~(1<<CCW);
38
// Temp abfragen
39
if(p_temp>=w_temp)
40
state=CW_AN;
41
break;
42
caseRESET:
43
44
default:
45
if((PINB&(1<<WB))&&!(PINB&(1<<KB)))
46
state=CCW_AN;
47
if(!(PINB&(1<<WB))&&(PINB&(1<<KB)))
48
state=CW_AN;
49
break;
50
}//Ende Switch-Case
Ich habe noch eine Initilisierungs "while" davor gesetzt, wo der Motor
erst mal grundlegend ins Kältebad fährt um einen definierten Startpunkt
zu haben.
Jetzt setze ich mal die Temperaturen von Hand:
Erster Versuch:
1
k_temp=0;
2
p_temp=0;
3
w_temp=14;
irgendwann drücke ich den Schalter KB, damit ist die Initialiserungs
"while" abgeschlossen. Der Motor dreht dann wie gewünscht Richtung
Wärmebad (CCW). Allerdings dreht er auch sofort wieder Richtung
Kältebad, wenn ich den Taster KB los lasse - das sollte nicht pasieren.
Der Motor sollte eigentlich solange CCW machen bis der Taster WB
gedrückt wird und dann erst mal abschalten.
zweiter Versuch:
1
k_temp=0;
2
p_temp=14;
3
w_temp=14;
das führt dazu das der Motor wieder zuerst in Richtung Kältebad dreht
(wegen der Initialisierungs while) und sobald ich den Taster KB betätige
stoppt der Motor und fährt sofort weiter in Richtung Kältebad wenn ich
den Taster wieder los lasse. Das ist so auch nicht Richtig.
Eigentlich soll der Motor ja in der Initialisierung erst mal ins
Kältebad fahren und abgeschaltet werden wenn KB gedrückt wird, das
funktioniert auch.
Als nächstes müste der Motor nun Richtung Kältebad drehen wenn der
Taster WB gedrückt wird.
Rocco L. schrieb:> Hier sollte eine kurze Initialisierung rein,> etwa so etwas wie fahre erst mal ins Kältebad bis der Endanschlagtaster> vom Kältebad gedrückt ist.
Hatte ich übersehen. Hier könnte sowas wie das folgende ergänzt werden:
1
caseRESET:
2
if(PINB&(1<<KB))
3
// Wenn nicht im Kältebad, dann fahre dort hin
4
state=CW_AN;
5
else
6
// Endschalter schon gedrückt, also bleibe an dieser Stelle
Rocco L. schrieb:> Ich habe noch eine Initilisierungs "while" davor gesetzt, wo der Motor> erst mal grundlegend ins Kältebad fährt um einen definierten Startpunkt> zu haben.
Dann wird sie ständig ausgeführt, d.h. die Statemaschine ist wieder
zerstört.
Da hat die Initialisierung also nichts zu suchen, sondern im State
RESET, genau dazu ist er gedacht.
Es dürfen kein Aktionen außerhalb der Statemaschine erfolgen!
Das ist der Trick an der Statemaschine, nur sie hat die Kontrolle, sonst
funktioniert sie nicht!
Du solltest Dir mal das Zustandsdiagramm aufzeichnen, mit alle Zuständen
und den Bedingungen zum Übergang in den nächsten Zustand.
http://www.htw-aalen.de/dti/o_mess/stat_mes.gif
Man kann nicht einfach blind drauflos programmieren.
Peter
ok, habe die doofe Initialisierungs "while" erst mal wieder raus
geschmissen. Damit klappt zumindest der Teil der switch-case wo sie ins
Wärmebad fahren soll wenn p_temp <= k_temp
dabei fährt der Motor auch erst dann los wenn der Anschlagtaster vom
Kältebad (KB) gedrückt ist und führt solange Richtung Wärmebad bis der
Taster vom Wärmebad gedrückt ist.
Leider passiert in die andere Richtung nichts. D.h. wenn
P_temp >= w_temp und WB Taster gedrückt fahre Richtung Kältebad bis KB
Taster gedrückt
also eigentlich muss der nur wieder aus dem Wärembad cw Richtung
Kältebad fahren wenn p_temp >= w_temp und das solange wie der Taster KB
nicht gedrückt ist.
Die "Höllenmaschine" (der Ausdruck passt, schließlich treibt mich das
Ding zur Weisglut) soll zum Untersuchen Thermoelektrischer Kristalle
dienen. Dabei sollen die Kristalle imer zwischen 2 Wasserbädern hin und
her gefahren werden. Dabei soll die Probe jeweils so lange in dem
Wasserbad hänge bis sie dessen Temperatur angenommen hat.
Wo muss man denn am besten die Entprellroutine in der switch-case
einbauen?
Peter Dannegger schrieb:>> Du solltest Dir mal das Zustandsdiagramm aufzeichnen, mit alle Zuständen> und den Bedingungen zum Übergang in den nächsten Zustand.> http://www.htw-aalen.de/dti/o_mess/stat_mes.gif
^^Ich habe es mal versucht und angehangen. Das Programm läft von links
nach rechts.
Rocco L. schrieb:> Wo muss man denn am besten die Entprellroutine in der switch-case> einbauen?
Außerhalb des switch-statements. Eigentlich ja am besten in einer
Timer-Routine, aber das Thema war ja weiter vorne schon mal dran.
Wenn Du die von Dir ausgesuchte Routine nehmen möchtest, dann würde ich
sie direkt vor das switch-statement setzen. Sie hat aber folgende
Nachteile:
- Falls ein Schaltkontakt/Eingang mal einen Fehler haben sollte (und
ständig abwechselnd ein und aus meldet), wird die entprellungs-Routine
nie beendet und der Motor nie abgeschaltet
- Der ermittelte entprellte Wert wird nicht verwendet, er kann sich also
bis zum nächste Einlesen wieder verändern
Ich bin mir gar nicht sicher, ob Du an dieser Stelle eine Entprellung
benötigst. Schließlich handelt es sich hier um einen Endlagenschalter
und der Motor soll ja abschalten sobald die Endlage erreicht ist. Aber
das hängt auch davon ab, wie schnell das Ganze abläuft, wenn es langsam
geht und die Zeitverzögerung (mind. 1,2ms) kein Problem darstellt, dann
nimm es mit rein.
Die Zeitverzögerunge am Endanschlagschalter stört mich nicht.
Ich habe heute noch mal alles Durchgemessen und habe 2 Sachen
herausgefunden:
1.) nie wieder mehere Atmegas benutzen wenn es auch einer schaffen
könnte!
Die Kabellei, auch wenn ich viele Leiterbahnen unter dem
Punktraster
habe ist einfach fieß wenn ein Fehler drin ist.
2.) Ich habe eine Pinreihe falsch angelötet.
Es ist die PINA die gegen PORTB des 2. Atmegas geschaltet ist.
So sollte es sein:
A0---B0
A1---B1
A2---B2
A3---B3
A4---B4
A5---B5
A6---B6
A7---B7
So ist es aber:
A0---B7
A1---B6
A2---B5
A3---B4
A4---B3
A5---B2
A6---B1
A7---B0
Ich kann nur hoffen das man das in Peter's bcd2bin über Programmieren
lösen kann. Vieleicht könnt Ihr mir dabei noch mal helfen:
Prinzipiell sollte es so gehen, aber eigentlich werden Funktionen nur in
besonderen Fällen innerhalb von anderen Funktionen definiert. Besser Du
setzt sie vor die main-Funktion:
???
Warum denkst Du, daß diese Reihenfolge funktionieren soll?
Stell Dir 2 Türen vor mit 2 Schlüsseln.
Wenn Du wieder raus willst, welchen Schlüssel mußt Du wohl zuerst
nehmen?
Bestimmmt nicht den zur Außentür.
Programmieren hat nichts mit Trial&Error zu tun, sondern hauptsächlich
mit logischem Denken, besonders bei Abläufen.
Peter
Ich habe heute noch mal die ganze Sache Richtig herum angelöted.
Zudem habe ich alle Verbindungen mehr als ausgibig überprüft. Die
Schaltung funktioniert 100%.
Der Code sieht so aus wie im Anhang.
Es ist z.Z. so das die switch-case zum Teil ausgeführt wird.
RESET wird ausgeführt, d.h. Der Motor fährt erst mal ins Kältebad bis
der Endanschlagschalter vom Kältebad (PINB & (1<<KB)) gedrückt ist.
Nachdem die Probentemperatur p_temp gleich mit der Temperatur vom
Kältebad k_temp ist fährt der Motor die Probe ins Wärmebad bis der
Endanschlagtaster vom Wärmebad gedrückt ist (PINB & (1<<KB)).
Hat dann die Probe die gleiche Temperatur wie das Wärmebad (w_temp)
sollte der Motor nun eigentlich die Probe wieder ins Kältebad bewegen -
aber es tut sich absolut nichts. Der Motor bewegt sich nicht. An dem
entsprechenden PORTB |= (1<<CW); liegt einfach kein Vcc an.
Es ist aber nicht so das das nicht gehen würde - steht in meiner Main
nur PORTB |= (1<<CW); dreht sich der Motor schön in Richtung Kältebad.
Ich werde daraus einfach nicht schlau - ich hoffe von euch hat noch
einer eine Idee.
Also zusammengefasst kommt er bis in den Schritt IM_WÄRMEBAD.
Mach doch mal folgendes:
Nimm zwei bisher unbenutzte Portpins, deklariere die als Ausgang und
schreibe die nur hier dazu:
1
caseIM_WAERMEBAD:
2
// Motor anhalten
3
PORTB&=~(1<<CCW);
4
PORTB&=~(1<<CW);
5
=>setzeunb.Portpin#1
6
// Temp abfragen
7
if((p_temp>=w_temp))
8
{
9
=>setzeunb.Portpin#2
10
state=CW_AN;
11
}
12
break;
13
14
caseCW_AN:
15
...
Jetzt siehst du, ob er wirklich in den Schritt geht (was ich denke) und
das die Weiterschaltbedingung, aus welchem Grund auch immer, nicht
anspricht...
jetzt leuchtet ein LED gegen GND an dem PORTB |= (1<<TESTA);
TESTB bringt kein LED zum Leuchten.
Nun aber der totale Wahnsinn:
Jetzt fährt der Motor Richtung Kältebad aber macht dies obwohl die
Temperatur p_temp kleiner ist als die von W_temp
Eigentlich sollte das erst passieren wenn p_temp >= w_temp ist.
Irgendwie ist irgendwas total faul.
Volkmar Dierkes schrieb:> aber eigentlich werden Funktionen nur in> besonderen Fällen innerhalb von anderen Funktionen definiert
Ja, das macht man eigentlich nur in Sprachen, in denen das möglich
ist...
Martin schrieb:> Volkmar Dierkes schrieb:>> aber eigentlich werden Funktionen nur in>> besonderen Fällen innerhalb von anderen Funktionen definiert>> Ja, das macht man eigentlich nur in Sprachen, in denen das möglich> ist...
^^mache ich doch eigentlich im neuen Quelltext nicht mehr - oder?
Deklariert habe ich das so:
MOTOR_DDR = (1 << DDB0) | (1 << DDB1) | (1 << DDB4) | (1 << DDB5) | (1
<< DDB6) | (1 << DDB7) ;
Wobei B4 TestA ist und B5 TestB
Diesemal habe ich mal TestA und TestB einfach vertauscht und es leuchtet
wie erwartet das LED an dem PORTB |= (1<<TESTB);
1
caseIM_WAERMEBAD:
2
// Motor anhalten
3
PORTB&=~(1<<CCW);
4
PORTB&=~(1<<CW);
5
PORTB|=(1<<TESTB);
6
// Temp abfragen
7
if((p_temp>=w_temp))
8
PORTB|=(1<<TESTA);
9
state=CW_AN;
10
break;
jetzt habe ich mal TESTB wieder ausschalten wollen:
1
caseIM_WAERMEBAD:
2
// Motor anhalten
3
PORTB&=~(1<<CCW);
4
PORTB&=~(1<<CW);
5
PORTB|=(1<<TESTB);
6
// Temp abfragen
7
if((p_temp>=w_temp))
8
PORTB&=~(1<<TESTB);
9
PORTB|=(1<<TESTA);
10
state=CW_AN;
11
break;
aber es führte dazu das beide LED nun gegen GND leuchteten.
Den Atmega habe ich auch gleich mal getauscht - hat sich aber nichts
geändert.
Ich beise bald eine Ecke vom Tisch ab.
ist hinter jeder if eine geschweifte Klammer erst mal grundlegend
richtig und kann aber unter bestimmten umständen weg gelassen werden?
ich habe es mir jetzt so zusammengereimt:
Bei meheren Statements müssen geschweifte Klamern hin
if ()
{
...;
...;
...;
...
}
Bei nur einem Statemment müssen keine geschweiften Klammern hin:
if ()
...;
Richtig?
>Richtig?
Genau. Um sowas wie gerade zu vermeiden, schreibe ich das eine Statement
immer hinter das if:
1
if(..)blabla
oder bei mehreren mit Klammern unternander:
1
if(...)
2
{
3
..
4
}
>Ach so, TESTB ist high und der Motor dreht nicht in Richtung Kältebad>obwohl p_temp >= w_temp
Da du die beiden TESTB und TESTA ja nur an der einen Stelle benützt,
kann das nur heißen, dass die Bedingung:
1
if((p_temp>=w_temp))
nie erfüllt ist. Auch wenn es so sein sollte oder du das denkst. Also
ist das zu prüfen.
Achja, ich würde dir empfehlen, vernünftig einzurücken im Code.
Was mir gerade auffällt:
Das einlesen der Temp erfolgt ja so:
1
val=PINx;
2
hilf=(val&0x0F)+(val>>4)*10;
3
4
temp=~hilf;
Sicher, dass das so richtig ist? Wie liegen denn die Daten an den Pins
vor?
Weil, falls die Daten an den Pins als LOW-aktiv vorliegen, würde ich
erst invertieren und dann nach binär wandeln:
1
uint8_tbcd2bin(uint8_tval)
2
{
3
uint8_thilf=~val;
4
return(hilf&0x0F)+(hilf>>4)*10;
5
}
Und das x = ~x im main weglassen.
Beispiel: AM Pin liegt low-activ in bcd eine 25 an.
also ergibt das einlesen val = ~( (2<<4) | (5<<0) ) = 0xDA = 218
nach deiner Rechnung kommt jetzt bcd=> nach bin ein 13*10 + 10 = 140
raus.
Das negiert ergibt 116. Es sollte aber 25 sein...
Ich habe gerade im Kältebad 11°C das kann ich ablesen weil follgende LED
leuchten:
| | = leuchten nicht
|X| = leuchten
|X| |X|
| | | |
| | | |
| | | |
dabei haben die LED follgende Wert und führen durch Addition zur
Temperatur:
|1| |10|
|2| |20|
|4| |40|
|8| |80|
Im Wärmebad sind es 34°C:
| | |X|
| | |X|
|X| | |
| | | |
Die Probe hat ebenfals so eine LED Anzeige.
Diese LED Anzeigen werden von 3 Atmega48 betrieben. Zudem sind die LED
PORTS der Mega48 mit denen des MEGA16 verbunden der die Motorsteuerung
übernimmt.
Ich habe schon (mitlerweile unendliche male) getestet ob beim Mega16
auch Strom an dem Beinchen ankommt wenn das entsprechenden LED vom
Mega48 angesteuert wird. Das ist wirklich alles richtig.
Der Mega48 nutzt PORTB um die LED anzusteuern. Dabei werden die LED so
angesteuert:
PB0 -- LED 1
PB1 -- LED 2
PB2 -- LED 4
PB3 -- LED 8
PB4 -- LED 10
PB5 -- LED 20
PB6 -- LED 40
PB7 -- LED 80
Zudem sind die B Ports des Mega48 immer entsprechend mit den Ports des
Mega 16 verbunden hier am Bsp des Mega48 der die Probentemperatur misst
und die Signale an PINA des Mega16 weiter gibt
Mega48 -- Mega16
PB0 -- A0
PB1 -- A1
PB2 -- A2
PB3 -- A3
PB4 -- A4
PB5 -- A5
PB6 -- A6
PB7 -- A7
Wenn ich messe, messe ich dierekt auf den Beinchen der Mega um zu sehen
ob ein Signal von einem zum anderen Beinchen übertragen wird.
Das haut alles hin.
Kann ich nicht irgendwie die 3 DS18S20 mit an den MEGA16 klemmen? Leider
ist mir das zu hoch - ich war nach ewigen Probieren froh als einer lief.
Ich hänge mal den Quelltext der Mega48 mit dran - vieleicht kann man das
irgendwie auf den Mega16 bekommen. Über Einen Vorschlag würde ich mich
sehr freuen.
>|X| |X|>| | | |>| | | |>| | | |
Das ist doch nichtssagend.
Annahme: Du hast irgendwo 11Grad, die auf der Anzeige korrekt angezeigt
werden. Welche Pegel misst du jetzt an den entsprechenden Pins des µC
mit der StateMaschine?
>> Sicher, dass das so richtig ist? Wie liegen denn die Daten an den Pins> vor?>> Weil, falls die Daten an den Pins als LOW-aktiv vorliegen, würde ich> erst invertieren und dann nach binär wandeln:>>
1
>uint8_tbcd2bin(uint8_tval)
2
>{
3
>uint8_thilf=~val;
4
>return(hilf&0x0F)+(hilf>>4)*10;
5
>}
6
>
> Und das x = ~x im main weglassen.>>> Beispiel: AM Pin liegt low-activ in bcd eine 25 an.> also ergibt das einlesen val = ~( (2<<4) | (5<<0) ) = 0xDA = 218> nach deiner Rechnung kommt jetzt bcd=> nach bin ein 13*10 + 10 = 140> raus.> Das negiert ergibt 116. Es sollte aber 25 sein...
^^die Fahrt bis ins Wärmebad funktioniert wieder, allerdings bleibt er
dort wieder hängen und TESTB ist high
Matthias Lipinsky schrieb:>>|X| |X|>>| | | |>>| | | |>>| | | |>> Das ist doch nichtssagend.>> Annahme: Du hast irgendwo 11Grad, die auf der Anzeige korrekt angezeigt> werden. Welche Pegel misst du jetzt an den entsprechenden Pins des µC> mit der StateMaschine?
Wenn 11°C angezeigt werden dann messe ich am Atmega 48 gegen Vcc 4,88V
an den PORTS PB0 und PB4
alle anderen ergeben 0V gegen Vcc
Gleichzeitig messe ich am Mega16 an den PINS PD0 und PD4 4,88V gegen Vcc
alle anderen haben 0V
>Wenn 11°C angezeigt werden dann messe ich am Atmega 48 gegen Vcc 4,88V>an den PORTS PB0 und PB4>alle anderen ergeben 0V gegen Vcc>Gleichzeitig messe ich am Mega16 an den PINS PD0 und PD4 4,88V gegen Vcc>alle anderen haben 0V
Das klingt nach HIGH-aktiv. Dann sollte die ursprüngliche bcd2bin
Routine richtig sein, aber deine x=~x danach müssten raus.
Achja. Hier stehts ja:
>Dabei werden die LED so angesteuert:
Wenn jetzt der Pin ein HIGH=5V ausgibt, damit die LED leuchtet, dann
sollte mein voriger Post stimmen.
Ein Schaltplan sagt mehr al tausend Worte. Nutze mal statt den
Beschreibungen Vcc und Vcc einfach Ub und GND.
Also lt. Schaltplan ist die LED an, wenn du LOW ausgibst. also gilt
meine Vermutung im Post 20:15.
>und in der Main>p_tem = ~p_temp;>k_tem = ~k_temp;>w_tem = ~w_temp;>einfach weglassen ?
Ja. Und als Funktion die nutzen:
So wie ich den MEGA16 (Habe einen MEGA16 PU 0829K) ist die doch rintig -
oder gabs da mal eine Veränderung - vorallem beim PINA ?
Der scheint ja nur irgendwie die Probentemperatur falsch zu
bekommen...glaube ich zumindest, obwohl die Laut LED-Messstift und
Multimeter genau so angesteuert werden wie PIND und PINC
Ich wollte schreiben:
So wie ich den Mega 16 gezeichnet habe ist das doch richtig...
Es kann auch nicht sein das PINA nicht als inputs zulässig sind sondern
nur als outputs?!
>Es kann auch nicht sein das PINA nicht als inputs zulässig sind sondern>nur als outputs?!
Nein nein. Dann würde das Register PINA auch keinen Sinn machen.
Hast du alle Vcc und GND Pins des µC verbunden? Weil wir hattens hier
im FOrum schon, dass PINA ist auch Analogeingang. Und wenn die Pins AVdd
(oder so) nicht korrekt mit den anderen Versorgungspins verbunden ist,
das es dann Probleme mit dem Port gibt.
Das denk ich nämlich auch - ich steck mir das gerade mal auf dem
Steckbrett auf - melde mich morgen was raus gekommen ist.
Jedenfals besten Dank für Deine Unterstützung!
Das hat mir sehr geholfen.
mach doch mal einen Test:
Den µC, dort gibst du an PortA deine Temperatur von der Anzeige rein und
an nem anderen Port kommt die Temperatur (also nach der funktion
bcd2bin) binär wieder raus. Das kannst du testen.