PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Zeitsteuerung



Blamaster
24.02.2007, 18:55
Hi,

ich bräuchte Hilfe bei der Umsetzung einer Zeitsteuerung.

Also Hardware habe ich den Mega 16.

Folgendes sollte umgesetzt werden:

Jedem Kanal soll eine Zeitmarke nach Start zugewiesen werden. Sprich man Startet das Programm und nach dem Starten soll z.B. nach 1,2sek der 1. Kanal angesteuert werden. Kanal 2 dann z.B. 2 min nach Start.

Wie ist das umsetzbar ?

mfg Yannic

magic33
24.02.2007, 19:45
was verstehst du unter kanal bitte port pwm pder was

hellseher gibts hier keine

Blamaster
24.02.2007, 20:36
Die Ausgänge PA, PB , PC und PD

magic33
25.02.2007, 08:53
also damit ich das richtig verstehe

wenn pa high wird dann start

nach zeit pb high nach zeit pc high

und wie geht das ganze wieder zurück

sehr konfuss die beschreibung

Blamaster
25.02.2007, 09:18
Okay nochmal.

PA1 high Programm startet.

nach 1min PA2 high für 1 sek.
nach 1,20min PA3 high für 1 sek.
nach 1,30min PA4 high für 1 sek.

usw. Am Ende soll sich das Programm selber wieder auf reset stllen.

helimike0705
25.02.2007, 09:57
am einfachsten ist dies mit wait und waitms zumachen,eleganter
und genauer mit timern.ein timer zählt z.b. im sekundentakt
und ein zähler wird hochgezählt.der zählerstand abgefragt und bei
erreichen der jeweiligen zeit ,eine sekunde der port ein und wieder ausgeschalten.
am ende ein reset durch zurücksetzten des zählers und warten auf
den startimpuls.

helimike0705
25.02.2007, 10:02
https://roboternetz.de/phpBB2/viewtopic.php?t=27392

hoffe der link funzt.habe hübi da auch mal geholfen.das programm
ist so ähnlich wie du es möchtest,musst nur deine zeitabfragen
einbringen.

Blamaster
25.02.2007, 10:14
@helimike

könntest du dazu ein codebeispiel geben ?

helimike0705
25.02.2007, 10:20
was soll den genau passieren,habe den mega16 leider nicht.
aber der code aus dem link müsste wenn du das $regfile vom
mega16 nimmst,laufen.frage dann einfach nach deiner zeit (in sekunden)
den zähler ab und schalte deinen jeweiligen port-pin ein und wieder aus.
der zähler in dem link wird im sekundentakt incrementiert (hochgezählt).

Blamaster
25.02.2007, 10:37
Kann man den Zähler auch in Minuten:Sekundn:Millisekunden laufen lassen ?

helimike0705
25.02.2007, 10:38
'hier nach der debounce abfrage von porta.1

Wait 1
A = A + 1
If A = 60 Then
Porta.2 = 1
If A = 61 Then
Porta.2 =0
End If
If A =80 Then
Porta.4 = 1
If A = 81 Then
Porta.3 = 0
End If
If A = 90 Then
Porta.4 = 1
If A = 91 Then
Porta.4 = 0
End if

Loop Until A > 91

A = 0

'wieder an den progamm anfang springen

weiss jetzt nicht wenn du das so übernimmst, ab dies läuft!
aber so in etwa sollte es funktionieren.
habe jetzt nicht viel zeit ,aber morgen werde ichmir das mal
näher ansehen.
berichte wie weit du bist.


edit:

sicher kannst du das machen,musst nur die wait 1 ändern und in millisekunden zählen lassen und die entsprechenden zeiten eintragen.

Blamaster
25.02.2007, 16:39
Müsste es nicht auch so klappen ?


$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)

Config Pinc.A = Output
Kanal1 Alias Porta.0
Config Pinc.A = Output
Kanal2 Alias Porta.1
Config Pinc.A = Output
Kanal3 Alias Porta.2

Wait 1
A = A + 1

If A = 60 Then
Kanal1 = 1
Waitms 1000
End If

If A = 70 Then
Kanal2 = 1
Waitms 1000
End If

Loop Until A > 71

A = 0

helimike0705
25.02.2007, 16:59
es fehlen noch das ausschalten der pins und die deklarierung
des pins heisst pinc.1 und nicht pinc.a.

schau dir den code von dem link weiter oben mal an und verwende mal deinen mega16,wenns nicht klappt schreibe ich dir morgen mal dein
programm.gebe mir aber mal die genauen anforderungen dazu,oder
ist das was du ganz oben geschrieben hast noch aktuell.

Blamaster
25.02.2007, 17:33
Hi, danke das du das machen würdest.

Ja das von oben ist noch Aktuell. Nur die Zeit soll in Minuten/Sekunden/Millisekunden angegeben werden.

mfg Yannic

helimike0705
26.02.2007, 18:21
so habe mal ein kleines prog geschrieben,schreibe es auf deine
ports um. nur so lernst du etwas.ich habe auch erst im dez 2006
angefangen.ich nehme mir kleine programme aus denn forum und
schreibe sie mir um und erweitere sie,nur so lernt man etwas.
auch wenn man sie nicht braucht.also viel spass damit.
[/code]

Blamaster
26.02.2007, 21:10
Danke werd ich machen :)

Blamaster
01.03.2007, 16:19
Hi,

also ich hab heute mein Board von Pollin bekommen und erstmal die testdatei von denen aufgespielt. Funktioniert soweit auch alles super:

Testdatei von Pollin:


'--------------------------------------------------------------------------'
' Testtool.bas '
' 2006 ,Pollin Electronic '
' Freeware '
'--------------------------------------------------------------------------'
' '
'Pollin Electronic Atmel-Evaluation-Board '
'Bestellnummer: 810022 '
'Testprogramm für ATmega16 '
'Der gesendete Text kann mit dem Hyperterminal von Windows angezeigt werden' '
'Einstellungen am Hyperterminal: '
' Bits pro sekunde: 9600 '
' Datenbits : 8 '
' Parität : keine '
' Stoppbits : 1 '
' Flusssteuerung : keine '
' '
'--------------------------------------------------------------------------'

$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)

Dim A As Byte 'dimensionieren der verwendeten Variablen
Dim B As Byte

Ddrd = &B11100000 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
Portd = &B00000000 'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)


Main: 'Hauptprogramm
Do 'Anfang der Schleife

If Pind.2 = 1 Then 'Wenn an Pin 2 von Port D ein high level anliegt, dann...

Toggle Portd.5 '...setze Pin 5 von Port D von high auf low oder umgekehrt
Bitwait Pind.2 , Reset 'warte bis an Pin 2 von Port D wieder ein low level anliegt

End If 'Ende der Bedingung
If Pind.3 = 1 Then 'Wenn an Pin 3 von Port D ein high level anliegt, dann...

Toggle Portd.6 '...setze Pin 6 von Port D von high auf low oder umgekehrt
Bitwait Pind.3 , Reset 'warte bis an Pin 3 von Port D wieder ein low level anliegt

End If 'Ende der Bedingung
If Pind.4 = 1 Then 'Wenn an Pin 2 von Port D ein high level anliegt, dann...

Gosub Beep '...gehe zum Untermenü "Beep"
Gosub Textausgabe '...gehe zum Untermenü "Textausgabe"
Bitwait Pind.4 , Reset 'warte bis an Pin 4 von Port D wieder ein low level anliegt

End If 'Ende der Bendingung

Loop 'zum Anfang der Schleife

Beep: 'Untermenü "Beep"

Portd.7 = 1 'setzte den Pin 7 von Port D auf high
Waitms 500 'Warte 500 ms
Portd.7 = 0 'setzt den Pin 7 von Port D auf low

Return 'zurück zum Hauptmenü

Textausgabe: 'Untermenü "Textausgabe"

Print "Atmel-Evaluation-Board" 'Sende den Text in den Anführungszeichen über RS232 zum PC

Return 'zurück zum Hauptmenü

Um Nun erstmal aufm Board zu testen ob die Zeitsteuerung funktioniert, habe ich sie auf die internen Boardelemente umgeschrieben:


$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)

Dim A As Byte 'dimensionieren der verwendeten Variablen
Dim B As Byte

Ddrd = &B11100000 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
Portd = &B00000000 'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)


Main1:
A = 0 'variable der zeit auf null 'Hauptprogramm
Do 'Anfang der Schleife

If Pind.2 = 1 Then 'Wenn an Pin 2 von Port D ein high level anliegt, dann...

Main2:

Do ' start der schleife

Wait 1 ' wartezeit eine sekunde

A = A + 1 'variable un eins erhöhen

If A = 5 Then ' bei 1 minute
Portd.5 = 1 'port einschalten
End If
If A = 10 Then
Portd.1 = 0 'nach einer sekunde wieder ausschalten
End If




Loop Until A > 20 'zeit abgelaufen schleife verlassen

'***** Zeit abgelaufen *************************

Goto Main1 'rücksprung zum start

End 'end programm

Leider passiert wenn ich den Taster aufm Board drücke nichts.

Han ich was falsch gemacht ? Eigentlich sollte auf em Board nach drücken des Tasters eine Led nach 5 Sek angehen. Die verwendeten Ports vom Pollin Board stehen im oberen Code.

Könnt ihr mir helfen ?

helimike0705
01.03.2007, 17:43
hallo, schaue dir deinen code mal genauer an.compilere ihn und du
bekommst deine fehler angezeigt.hast da einige drin.
nur mal so: main2: wo ist die?
do loop schleifen überprüfen.

mike

helimike0705
01.03.2007, 18:06
so habe dir den code geändert.
du darfst nicht einfach drauf los schreiben,musst dir schon ein
paar gedanken machen.immer im simulator prüfen oder
oben auf den syntax-prüfen icon drücken.dann bekommst du deine
fehler angezeigt

Blamaster
01.03.2007, 19:38
Hm, das programm funktioniert so leider trotzdem nicht.

Wenn ich den Taster drücke passiert nichts.

Edit. bzw. wie mache ich aus der .bas datei ne Hex Datein ? Wenn ich die .bes in Ponyprog einfüge macht er ja gleich ne Hex draus, aber dabei scheints probleme zu geben.

helimike0705
02.03.2007, 15:34
wie jetzt,aus der bas datei eine hex,die hex datei wird vom bascom-
programm beim compilieren doch erstellt.die hex kannst du mit
pony-prog dann laden.aber warum benutzt du nicht gleich bascom zum
brennen des controllers.
das programm noname65 läuft bei mir im simulator.aber wenn du die waitms 100 gebrauchst ist das evll zu schnell und du siehst nicht das deine led an und wieder aus geht.wenn dem nicht so ist schreibe mal genau was du machen möchtest.hast du eigentlich deine fehler erkannt in deinem programm?

Blamaster
02.03.2007, 17:34
Jao meine Fehler hab ich erkannt.

Welches Programm benutzt du denn ? Mit Basecom AVR kann ich jedenfalls keine Bascom Datein als Hex speichern.

helimike0705
02.03.2007, 18:06
ich habe bascom avr als demo geladen und arbeite damit schon eine weile.die vollversion möchte ich mir noch zulegen,aber bis jetzt reicht mir die demo.wenn du den bascom-code compilierst wird auch eine hex erstellt,gehe in den ordner wo deine bascom-datei steht und schaue dir die liste an.wenn dein bascom programm z.b. noname65.bas heisst,stehen darunter noch andere mit diesem namen und auch eine
noname65.hex.du musst nätürlich unten die anzeige einschalten dateityp:"all files(*.*)".
also melde dich nochmal wenns geht.

helimike0705
03.03.2007, 17:41
hallo, jetzt habe ich mal probiert was du gesagt hast.pony mit bascom-datei gefüttert.was du da erhältst ist keine hex programm im pony prog,sondern der angebliche hex-code den du da siehst ist nur einer vom text.also kein lauffähiger code.du musst schon im bascom deinen geschrieben code compilieren mit f7. oder du drückst den icon ,den zweiten rechts neben dem fernglas.ist das so richtig wie ich das verstanden habe.

Blamaster
03.03.2007, 23:10
Hi jetzt hab ich nochmal ne Frage. Hab jetzt mein Relai Modul fertig.

Dazu muss ich die Ausgänge B Komplett C Komplett und D die ersten
3. An den 4. von D soll der Taster zum starten.

Wie muss ich da diese zeilen hier ändern ?




Ddrd = &B11100000 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
Portd = &B00000000 'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)

Blamaster
06.03.2007, 16:44
Kann keiner mehr helfen ?

helimike0705
06.03.2007, 16:52
also ,dir wäre besser geholfen wenn du mal die fragen im ganzen satz schreiben würdest,mit deiner frage kann keiner etwas anfangen.nur muss ich feststellen das du vom programmier noch nicht viel ahnung hast.hast du schon mal ein lauflicht für deinen mc geschrieben,dabei kannst du viel lernen.
ich möchte nicht behaupten das ich gut proggen kann,aber ich lerne bei meinen programmen immer dazu.auch wie man einen port definiert,so das er macht was ich will.

Blamaster
06.03.2007, 18:58
Hallo,

die von mir oben zitierte Codestestelle gibt ja an welche pins von welchem port eingänge und welche Ausgänge sind.

Ich wollte wissen wie der code aussehen muss wenn ich alle pins von port b, alle pins von port c und alle pins von port d als ausgang haben will.

helimike0705
07.03.2007, 16:36
config portb = output
config portc = output
config portd = output

Blamaster
07.03.2007, 18:05
Ich hatte mich jetzt selber schonmal etwas eingelesen un esso verwirklicht:



$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)

Dim A As Byte 'dimensionieren der verwendeten Variablen
Dim B As Byte
Dim Main2 As Long

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pinb.6 = Output
Config Pinb.7 = Output

Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pinc.6 = Output
Config Pinc.7 = Output

Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output

Config Pind.4 = Input


Main1:
A = 0 'variable der zeit auf null 'Hauptprogramm
Do 'Anfang der Schleife

If Pind.4 = 1 Then Goto Main2 'Wenn an Pin 2 von Port D ein high level anliegt, dann...

Loop 'diese loop hat gefehlt


Main2: 'main2: ist hier -> dein unterprogramm


Do ' start der schleife

Waitms 100 ' wartezeit eine sekunde

A = A + 1 'variable un eins erhöhen

If A = 5 Then ' bei 1 minute
Portb.0 = 1 'port einschalten
End If
Waitms 10
Portb.0 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0


If A = 6 Then ' bei 1 minute
Portb.1 = 1 'port einschalten
End If
Waitms 10
Portb.1 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0

If A = 7 Then ' bei 1 minute
Portb.2 = 1 'port einschalten
End If
Waitms 10
Portb.2 = 0


If A = 8 Then ' bei 1 minute
Portb.3 = 1 'port einschalten
End If
Waitms 10
Portb.3 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0

If A = 9 Then ' bei 1 minute
Portb.4 = 1 'port einschalten
End If
Waitms 10
Portb.4 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 10 Then ' bei 1 minute
Portb.5 = 1 'port einschalten
End If
Waitms 10
Portb.5 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 11 Then ' bei 1 minute
Portb.6 = 1 'port einschalten
End If
Waitms 10
Portb.6 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 12 Then ' bei 1 minute
Portb.7 = 1 'port einschalten
End If
Waitms 10
Portb.7 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 13 Then ' bei 1 minute
Portc.0 = 1 'port einschalten
End If
Waitms 10
Portc.0 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 14 Then ' bei 1 minute
Portc.1 = 1 'port einschalten
End If
Waitms 10
Portc.1 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 15 Then ' bei 1 minute
Portc.2 = 1 'port einschalten
End If
Waitms 10
Portc.2 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 16 Then ' bei 1 minute
Portc.3 = 1 'port einschalten
End If
Waitms 10
Portc.3 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 17 Then ' bei 1 minute
Portc.4 = 1 'port einschalten
End If
Waitms 10
Portc.4 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 18 Then ' bei 1 minute
Portc.5 = 1 'port einschalten
End If
Waitms 10
Portc.5 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 19 Then ' bei 1 minute
Portc.6 = 1 'port einschalten
End If
Waitms 10
Portc.6 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 20 Then ' bei 1 minute
Portc.7 = 1 'port einschalten
End If
Waitms 10
Portc.7 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 21 Then ' bei 1 minute
Portd.0 = 1 'port einschalten
End If
Waitms 10
Portd.0 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 22 Then ' bei 1 minute
Portd.1 = 1 'port einschalten
End If
Waitms 10
Portd.1 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 23 Then ' bei 1 minute
Portd.2 = 1 'port einschalten
End If
Waitms 10
Portd.2 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
If A = 24 Then ' bei 1 minute
Portd.3 = 1 'port einschalten
End If
Waitms 10
Portd.3 = 0 'Portd.5 wieder ausgeschalten
'nicht portd.0 =0
'Portd.5 wieder ausgeschalten
'nicht portd.0 =0


Loop Until A > 25 'zeit abgelaufen schleife verlassen

'***** Zeit abgelaufen *************************

Goto Main1 'rücksprung zum start

End 'end programm


Es gibt aber ein Problem. Sobald das ControllerboardStrom bekomt, fängt das Programman zu laufen, ohne ds ich den Taster gedrückt habe.

helimike0705
07.03.2007, 18:26
na siehst du, es geht doch.man muss nur wollen ,richtig.
als tip, wenn du den ganzen port als ausgang möchtest,reicht
config port.... = output

programm fängt sofort an zulaufen.
warum wohl:dein problem liegt in der abfrage von pind.4 !
hast du einen taster gegen masse geschaltet,oder plus ?

achso, kannst du jetzt dein hex-file finden und mit bascom in den controller laden.oder mit pony prog.

Blamaster
07.03.2007, 18:41
Hi, also den Taster hab ich momentan komplett rausgenommen. Trotzdem startet das Programm gleich.

Ansonsten ist der Taster gegen + gechaltet.

Das erstellen der Hex und übertragen mit Ponyprog funktioniert absolut problemlos.

helimike0705
07.03.2007, 18:46
wenn du den taster gegen plus hast musst du an den pin einen widerstand gegen minus machen ,so 4-10 kohm,damit er gegen minus gezogen wird.da dein taster ein plus einbringt.machst du aber eine taster gegen minus ist das einfacher ,da kannst du den internen widerstand ein schalten.und deine abfrage muss sich für den pin auf null beziehen.
if pind.4 = 0 then ....

Blamaster
07.03.2007, 18:49
Wie schlate ich denn den internen wiederstand ein ?

helimike0705
07.03.2007, 18:50
Portd.4 = 1 'pull up Widerstand

helimike0705
07.03.2007, 18:55
hier mal ein test programm ,schreibe es für deinen controller um.

' Programm zum Abfragen der Tasten
'*******************************
$regfile = "2313def.dat" 'AT90S2313
$crystal = 4000000 'Quarz: 4,0 MHz
'******** Initialisierung ********
Ddrb = &B11111111 'PortB als Ausgang
Ddrd = &B0000000 'portd als Eingänge
Portd.2 = 1 '-pull up Widerstand
Portd.3 = 1 '-pull up Widerstand
'******** Hauptprogramm ********
Do
If Pind.2 = 0 Then Portb.1 = 1
If Pind.3 = 0 Then Portb.1 = 0
Loop

End

Blamaster
07.03.2007, 18:57
Also das bleibt.

Config Pind.4 = Input

Oder wohin kommt der wert ?

Blamaster
07.03.2007, 19:06
Edit. hab auch dieses Problem jezze hinbekommen.

Bleibt nur noch ein Punkt

2 Kanäle lösen daueraus. Sprich strom dran -> 2 Kanäle an obwohl das Programm und nihts gestartet wurde.

Müssen aus dem C Port sein.

Die Belegung des J4 Steckers kann man hier auf Seite 9 sehen:

http://www.pollin.de/shop/downloads/D810038B.PDF

müsste pin 19 un 21 sein.

Blamaster
12.03.2007, 20:05
Hi,

ich komm einfach nicht weiter.

Dürfte denn von grundaus an Port B,C und D eine Spannung anliegen ? Egal an welchem pin.

helimike0705
13.03.2007, 16:17
nein,du solltest deinen mc mal aus dem bord nehmen und ihn auf ein steckbrett setzten,und dort die minimal beschaltung,sprich plus minus
evll quarz,anschliessen.bei den ports als ausgang,darf nur wenn vom programm aktiviert eine spannung anliegen.schreibe dir ein kleines lauflicht programm und lasse die ports nacheinander einmal einschalten und wieder ausschalten.eine wartezeit pro ausgang so auf ein bis zwei sekunden,damit du zeit hast zum messen.oder mache gleich leds dran mit widerstand.

Blamaster
13.03.2007, 20:46
So ich hab jetzt mal direkt mit ner Led die einzelnen Pins der J4 Leiste abgetastet.

Also an:
pin 19 / PC2 / (TCK)
pin 21 / PC3 / (TMS)
pin 23 / PC5 / (TDI)

Allerdings leuchtet die LED bei den oben genannten ausgängen nur ganz schwach, also nicht so als wenn der Kanal normal masse schaltet.

Weiß jemand rat ?