Mondauto | | | | GDL | Hier kann einfach rund ums Mondauto geplaudert werden. |
| | | | |
| | GDL | Hallo,
ich habe mal begonnen mir meine Entwicklungsumgebung aufzubauen. Bitte noch nichts posten da noch nicht fertig. |
| | | | |
| | GDL | Hallo David,
supi es scheint zu funzen mit der Sortierung.
Hab mit Karola gesprochen, wir können bei Ihr uns zusammensetzen.Müssen noch genauen Termin in der 2ten Osterferienwoche ausmachen.
Die Pc-Anschaltplatine iss bereits geätzt und von Matthias gebohrt. Schauen nächste Tage durch, welche Teile mir noch abgehen, da einiges bereits vorhanden.
Servus Georg |
| | | | |
| | | | | | | |
| | GDL | Hi,
komme mit der PC-Anbindung gut voran. Bräuchte von dir die nächste Zeit ein USB nach Seriell Converterkabel.
USB ist computerseitiger Anschluss.
Servus Georg |
| | | | |
| | | Ist bereits auf dem Weg zu Dir! |
| | | | |
| | GDL | PC-Anbindung fertig und getestet mit Standardschnittstelle. Bin schon gespannt wie es mit dem Converterkabel aussieht.
Bin wieder länger Off, da ich mich mit der Übergabeplatine für die Schrittmotoransteuerung beschäftige. Sobald fertig melde ich mich wida. |
| | | | |
| | GDL | Ähh, Converterkabel noch nicht bei mir eingetroffen. |
| | | | |
| | | Uhm, ich schaue was da los ist! |
| | | | |
| | GDL | Hi David,
hier wurstle ich gerade rum. Aus diesem einfachen Basiccode macht meine Entwicklungsumgebung mit RVK-Basic sauberen Atmel Assemblercode. Und die neue USB Brennumgebung für Flash und EEprom funzt einwandfrei. Segor hat leider nicht alle Bauteile für H-Bridge. Ich suche nach anderen IC.
Um den Mikofurz zu schonen, sind einige Befehle in der Testphase deaktiviert. KompilierenMarkierenSeparierendevice 2313
mhz 8
' Baustein hat feste Adresse = 1 !!!!!
' wenn alles geht wird neuer Baustein mit Programmiertaste gebaut
ehadr = 0
lang = 0
eladr =1
kurz =1
'pause 500
' eedata madr:,60,61
' gosub eeprom
'**************** MAG4 12.2.7 *******************
dim byte@,6
' 0 RXD 1 TXD 4
dirport d,in
' Pin d,5 = Digitaleingang
' Pin b,1 = Enableausgang
' Pin b,2 = Anzahl Schritte
' Pin b,3 = Richtung
dirport b,out
'**************************** INIT PORTS ****************
outport b,0'alle Ausgänge null
XMIT INIT 9600'INIT UART
schalten=255'Damit Ausgang 0 am Anfang schaltet
'######################################################
'#################### Hauptprogramm ##################
'######################################################
'******************************************************************
'*************************** Programmschleife *********************
'******************************************************************
'timer0 on 64
' Led prüfen
setbit b,1
pause 500
clrbit b,1
pause 500
setbit b,2
pause 500
clrbit b,2
pause 500
setbit b,3
pause 500
clrbit b,3
do
edge down d,4
timer0 on 64
'null:
'inbit flanke,d,2
'if flanke = 0
' timer0 read wert
' goto null
'endif
edge up d,4
timer0 read wert
if wert > 3
if wert < 10
gosub eins
endif
endif
if wert > 10
if wert < 25
gosub nill
endif
endif
if bytenr = 4'nur iF und Lokdecodereigenentwicklung
bytenr = 0
hilfe =0
nullbit = 0
preambel = 0
bitnr = 0
gosub auswerten
endif
loop
'********************************************************************
'********************************************************************
'=======================================================
'============= Unterprogramme ==========================
'=======================================================
eins:
if preambel < 10
incr preambel
endif
if nullbit > 0
begin case bitnr
case 0
set hilfe,7
case 1
set hilfe,6
case 2
set hilfe,5
case 3
set hilfe,4
case 4
set hilfe,3
case 5
set hilfe,2
case 6
set hilfe,1
case 7
set hilfe,0
endcase
incr bitnr
if bitnr = 8
store byte@,bytenr,hilfe
if bytenr=0'IDLE abfangen
if hilfe=255
preambel=0
bytenr=0
hilfe=0
nullbit=0
bitnr = 0
schalten=255'Ausgang wieder freigeben
endif
endif
hilfe = 0
bitnr = 0
incr bytenr
nullbit = 0
endif
endif
return
'=======================================================
nill:
if preambel < 10'1. Nullbit nach Präambel
preambel = 0
bytenr = 0
hilfe = 0
nullbit = 0
bitnr = 0
goto nilend
endif
'Trennbit von Nullbit unterscheiden
if nullbit = 0
if preambel > 9
nullbit = 1
goto nilend
endif
endif
'==========================
if nullbit > 0
incr bitnr
if bitnr = 8
bitnr = 0
store byte@,bytenr,hilfe
hilfe = 0
incr bytenr
nullbit = 0
endif
endif
nilend:
return
'###############################################
auswerten:
read kurz,byte@,0
read lang,byte@,1
read daten,byte@,2
read fehler,byte@,3
hilfe = kurz xor lang
hilfe = hilfe xor daten' hier könnte Fehler liegen
if hilfe = fehler
hilfe = 0
inbit taste2,d,5
'if taste2 = 0
' hier Programmier LED später
'store madr:,60,kurz
'store madr:,61,lang
'pause 1000
'hier Programmier LED später
'read eladr,madr:,60 'Decoderadresse lesen
'read ehadr,madr:,61
'pause 50
'else
'read eladr,madr:,60 'Decoderadresse lesen Wert 60
'read ehadr,madr:,61 'Decoderadresse lesen Wert 61
'endif
gosub waehlen
endif
schluss:
hilfe=0
return
'======================================================
waehlen:
if ehadr | lang
goto ende
endif
if eladr | kurz
goto ende
endif
setbit b,2
pause 200
clrbit b,2
' Programmierled an
'Schrittmotorausgabe
begincase daten
case 64'Vorwärtslauf
setbit b,1
'Bit setzen
goto ende
case 65'Rückwärtslauf
clrbit b,1
'Bit Rücksetzen
goto ende
endcase
if daten > 191'Frequenzvorgabe
frequenz = daten
goto ende
endif
if frequenz = 0
frequenz = 200
endif
'Schrittausgabe
daten=daten-128
for hilfe = 0 to daten
toggle b,2
pause frequenz
toggle b,2
pause frequenz
next hilfe
ende:
'Empfangsbestätigung
'hier hernach Programmier Led aus
return
'========================================================================
eeprom:
'for j=1 to 50
' read eladr,madr:,60
' read ehadr,madr:,61
'next j
return
Und Assembler: KompilierenMarkierenSeparieren;..compiled by RVK Basic, revision 060521.0-rvk 0000
.include "2313def.inc"
.def EHADR_ =r0 ;..byte variable..EHADR
.def LANG_ =r1 ;..byte variable..LANG
.def ELADR_ =r2 ;..byte variable..ELADR
.def KURZ_ =r3 ;..byte variable..KURZ
.def SCHALTEN_ =r4 ;..byte variable..SCHALTEN
.def DUM_VAR_ =r5 ;..byte variable..DUM_VAR
.def WERT_ =r6 ;..byte variable..WERT
.def BYTENR_ =r7 ;..byte variable..BYTENR
.def HILFE_ =r8 ;..byte variable..HILFE
.def NULLBIT_ =r9 ;..byte variable..NULLBIT
.def PREAMBEL_ =r10 ;..byte variable..PREAMBEL
.def BITNR_ =r11 ;..byte variable..BITNR
.def DATEN_ =r12 ;..byte variable..DATEN
.def FEHLER_ =r13 ;..byte variable..FEHLER
.def TASTE2_ =r14 ;..byte variable..TASTE2
.def FREQUENZ_ =r15 ;..byte variable..FREQUENZ
RJMP RST_00 ;..reset location
RJMP INT_00 ;..ext interrupt0
RJMP INT_01 ;..ext interrupt1
RETI ;..timer1 capture
RJMP INT_T1C ;..timer1 compare
RJMP INT_T1 ;..timer1 overflow
RJMP INT_T0 ;..timer0 interrupt
RJMP RXC_00 ;...UART RX complete..
RJMP XMT_00 ;...UART empty..
RETI ;...UART TX complete..
RETI ;...analog comp.
;***END OF VECTOR TABLE********************
PSE_00: OUT TCCR0,r31;..pause subrtn
OUT TCNT0,r30
PSE_01: IN r31,TCNT0
CP r31,r30
MOV r30,r31
BRCC PSE_01
RET
INT_T0: RETI
INT_T1: RETI
INT_T1C: RETI
INT_T0C: RETI
INT_T2C: RETI
INT_00: RETI
INT_01: RETI
ADC_00: RETI ;ignore A/D interrupts
RXC_00: RETI ;ignore UART RECV interrupts
XMT_00: RETI ;ignore UART EMPTY interrupts
;.......................................
RST_00: CLR r31 ;...main program begins here..
OUT ACSR,r31;..power up anlg comp...
LDI yl,LOW(RAMEND)
OUT SPL,yl ;..init stack ptr..
;mhz 8
;ehadr = 0
LDI r31,$0
MOV EHADR_,r31
;lang = 0
LDI r31,$0
MOV LANG_,r31
;eladr =1
LDI r31,$1
MOV ELADR_,r31
;kurz =1
LDI r31,$1
MOV KURZ_,r31
;dim byte@,6
LDI r31,$0 ;dirport d,in
OUT DDRD,r31
LDI r31,$FF ;dirport b,out
OUT DDRB,r31
LDI r31,$0 ;outport b,0'alle Ausgänge null
OUT PORTB,r31
IN r31,UCR ;XMIT INIT 9600'INIT UART
ORI r31,$08
OUT UCR,r31
XM001: IN r31,USR
ANDI r31,$20
BREQ XM001
LDI r31,$33
OUT UBRR,r31
;schalten=255'Damit Ausgang 0 am Anfang schaltet
LDI r31,$FF
MOV SCHALTEN_,r31
SBI PORTB,$1 ;setbit b,1
;pause 500
LDI r31,$0 ;pause 500
MOV DUM_VAR_,r31
FL001B: INC DUM_VAR_
LDI r31,$5
LDI r30,$C
RCALL PSE_00
SEI
FL001N: LDI r31,$10
CPSE DUM_VAR_,r31
RJMP FL001B
FL001E: CBI PORTB,$1 ;clrbit b,1
LDI r31,$0 ;pause 500
MOV DUM_VAR_,r31
FL002B: INC DUM_VAR_
LDI r31,$5
LDI r30,$C
RCALL PSE_00
SEI
FL002N: LDI r31,$10
CPSE DUM_VAR_,r31
RJMP FL002B
FL002E: SBI PORTB,$2 ;setbit b,2
LDI r31,$0 ;pause 500
MOV DUM_VAR_,r31
FL003B: INC DUM_VAR_
LDI r31,$5
LDI r30,$C
RCALL PSE_00
SEI
FL003N: LDI r31,$10
CPSE DUM_VAR_,r31
RJMP FL003B
FL003E: CBI PORTB,$2 ;clrbit b,2
LDI r31,$0 ;pause 500
MOV DUM_VAR_,r31
FL004B: INC DUM_VAR_
LDI r31,$5
LDI r30,$C
RCALL PSE_00
SEI
FL004N: LDI r31,$10
CPSE DUM_VAR_,r31
RJMP FL004B
FL004E: SBI PORTB,$3 ;setbit b,3
LDI r31,$0 ;pause 500
MOV DUM_VAR_,r31
FL005B: INC DUM_VAR_
LDI r31,$5
LDI r30,$C
RCALL PSE_00
SEI
FL005N: LDI r31,$10
CPSE DUM_VAR_,r31
RJMP FL005B
FL005E: CBI PORTB,$3 ;clrbit b,3
DL001B: ;do
ED002: IN r31,PIND ;edge down d,4
ANDI r31,$10
CPI r31,$10
BRNE ED002
ED001: IN r31,PIND
ANDI r31,$10
CPI r31,$0
BRNE ED001
CLR r31 ;timer0 on 64
OUT TCNT0,r31
LDI r31,$3
OUT TCCR0,r31
ED003: IN r31,PIND ;edge up d,4
ANDI r31,$10
CPI r31,$0
BRNE ED003
ED004: IN r31,PIND
ANDI r31,$10
CPI r31,$10
BRNE ED004
IN WERT_,TCNT0 ;timer0 read wert
LDI r29,$3 ; if wert > 3
CP r29,WERT_
BRLO IF002
RJMP IF001E
IF002: LDI r29,$A ; if wert < 10
CP WERT_,r29
BRCS IF005
RJMP IF004E
IF005: ; gosubeins
RCALL eins
; endif
IF004E: ; endif
IF001E: LDI r29,$A ;if wert > 10
CP r29,WERT_
BRLO IF008
RJMP IF007E
IF008: LDI r29,$19 ; if wert < 25
CP WERT_,r29
BRCS IF011
RJMP IF010E
IF011: ; gosubnill
RCALL nill
; endif
IF010E: ;endif
IF007E: LDI r29,$4 ;if bytenr = 4'nur iF und Lokdecodereigenentwicklung
CPSE BYTENR_,r29
RJMP DL001L
; bytenr = 0
LDI r31,$0
MOV BYTENR_,r31
; hilfe =0
LDI r31,$0
MOV HILFE_,r31
; nullbit = 0
LDI r31,$0
MOV NULLBIT_,r31
; preambel = 0
LDI r31,$0
MOV PREAMBEL_,r31
; bitnr = 0
LDI r31,$0
MOV BITNR_,r31
; gosub auswerten
RCALL auswerten
;endif
DL001L: RJMP DL001B ;loop
EINS: LDI r29,$A ;if preambel < 10
CP PREAMBEL_,r29
BRCS IF017
RJMP IF016E
IF017: INC PREAMBEL_ ; incr preambel
;endif
IF016E: LDI r29,$0 ;if nullbit > 0
CP r29,NULLBIT_
BRLO IF020
RJMP IF019E
IF020: ; begin casebitnr
CA0010: LDI r31,$0 ; case 0
CP BITNR_,r31
BREQ CN0001
CT0001:
RJMP CA0011
CN0001: LDI r31,$80 ; set hilfe,7
OR HILFE_,r31
RJMP CA001X
CA0011: LDI r31,$1 ; case 1
CP BITNR_,r31
BREQ CN0002
CT0002:
RJMP CA0012
CN0002: LDI r31,$40 ; set hilfe,6
OR HILFE_,r31
RJMP CA001X
CA0012: LDI r31,$2 ; case 2
CP BITNR_,r31
BREQ CN0003
CT0003:
RJMP CA0013
CN0003: LDI r31,$20 ; set hilfe,5
OR HILFE_,r31
RJMP CA001X
CA0013: LDI r31,$3 ; case 3
CP BITNR_,r31
BREQ CN0004
CT0004:
RJMP CA0014
CN0004: LDI r31,$10 ; set hilfe,4
OR HILFE_,r31
RJMP CA001X
CA0014: LDI r31,$4 ; case 4
CP BITNR_,r31
BREQ CN0005
CT0005:
RJMP CA0015
CN0005: LDI r31,$8 ; set hilfe,3
OR HILFE_,r31
RJMP CA001X
CA0015: LDI r31,$5 ; case 5
CP BITNR_,r31
BREQ CN0006
CT0006:
RJMP CA0016
CN0006: LDI r31,$4 ; set hilfe,2
OR HILFE_,r31
RJMP CA001X
CA0016: LDI r31,$6 ; case 6
CP BITNR_,r31
BREQ CN0007
CT0007:
RJMP CA0017
CN0007: LDI r31,$2 ; set hilfe,1
OR HILFE_,r31
RJMP CA001X
CA0017: LDI r31,$7 ; case 7
CP BITNR_,r31
BREQ CN0008
CT0008:
RJMP CA001X
CN0008: LDI r31,$1 ; set hilfe,0
OR HILFE_,r31
; endcase
CA001X: INC BITNR_ ; incr bitnr
LDI r29,$8 ; if bitnr = 8
CPSE BITNR_,r29
RJMP IF022E
LDI r30,$60 ; store byte@,bytenr,hilfe
ADD r30,BYTENR_
CLR r31
ST Z,HILFE_
LDI r29,$0 ; if bytenr=0'IDLE abfangen
CPSE BYTENR_,r29
RJMP IF025E
LDI r29,$FF ; if hilfe=255
CPSE HILFE_,r29
RJMP IF028E
; preambel=0
LDI r31,$0
MOV PREAMBEL_,r31
; bytenr=0
LDI r31,$0
MOV BYTENR_,r31
; hilfe=0
LDI r31,$0
MOV HILFE_,r31
; nullbit=0
LDI r31,$0
MOV NULLBIT_,r31
; bitnr = 0
LDI r31,$0
MOV BITNR_,r31
; schalten=255'Ausgang wieder freigeben
LDI r31,$FF
MOV SCHALTEN_,r31
; endif
IF028E: ; endif
IF025E: ; hilfe =0
LDI r31,$0
MOV HILFE_,r31
; bitnr = 0
LDI r31,$0
MOV BITNR_,r31
INC BYTENR_ ; incr bytenr
; nullbit = 0
LDI r31,$0
MOV NULLBIT_,r31
; endif
IF022E: ;endif
IF019E: RET ;return
NILL: LDI r29,$A ;if preambel < 10'1. Nullbit nach Präambel
CP PREAMBEL_,r29
BRCS IF032
RJMP IF031E
IF032: ; preambel =0
LDI r31,$0
MOV PREAMBEL_,r31
; bytenr = 0
LDI r31,$0
MOV BYTENR_,r31
; hilfe = 0
LDI r31,$0
MOV HILFE_,r31
; nullbit = 0
LDI r31,$0
MOV NULLBIT_,r31
; bitnr = 0
LDI r31,$0
MOV BITNR_,r31
RJMP nilend ; goto nilend
;endif
IF031E: LDI r29,$0 ;if nullbit = 0
CPSE NULLBIT_,r29
RJMP IF034E
LDI r29,$9 ; if preambel > 9
CP r29,PREAMBEL_
BRLO IF038
RJMP IF037E
IF038: ; nullbit =1
LDI r31,$1
MOV NULLBIT_,r31
RJMP nilend ; goto nilend
; endif
IF037E: ;endif
IF034E: LDI r29,$0 ;if nullbit > 0
CP r29,NULLBIT_
BRLO IF041
RJMP NILEND
IF041: INC BITNR_ ; incr bitnr
LDI r29,$8 ; if bitnr = 8
CPSE BITNR_,r29
RJMP IF043E
; bitnr = 0
LDI r31,$0
MOV BITNR_,r31
LDI r30,$60 ; store byte@,bytenr,hilfe
ADD r30,BYTENR_
CLR r31
ST Z,HILFE_
; hilfe = 0
LDI r31,$0
MOV HILFE_,r31
INC BYTENR_ ; incr bytenr
; nullbit = 0
LDI r31,$0
MOV NULLBIT_,r31
; endif
IF043E: ;endif
NILEND: RET ;return
AUSWERTEN: SBI PORTB,$2 ;setbit b,2
LDI r31,$0 ;pause 200
MOV DUM_VAR_,r31
FL006B: INC DUM_VAR_
LDI r31,$5
LDI r30,$21
RCALL PSE_00
SEI
FL006N: LDI r31,$7
CPSE DUM_VAR_,r31
RJMP FL006B
FL006E: CBI PORTB,$2 ;clrbit b,2
LDI r30,$60 ; read kurz,byte@,0
LDI r31,$0
ADD r30,r31
CLR r31
LD KURZ_,Z
LDI r30,$60 ; read lang,byte@,1
LDI r31,$1
ADD r30,r31
CLR r31
LD LANG_,Z
LDI r30,$60 ; read daten,byte@,2
LDI r31,$2
ADD r30,r31
CLR r31
LD DATEN_,Z
LDI r30,$60 ; read fehler,byte@,3
LDI r31,$3
ADD r30,r31
CLR r31
LD FEHLER_,Z
;hilfe = kurz xor lang
MOV r31,KURZ_
MOV r29,LANG_
EOR r31,r29
MOV HILFE_,r31
;hilfe = hilfe xor daten' hier könnte Fehler liegen
MOV r31,HILFE_
MOV r29,DATEN_
EOR r31,r29
MOV HILFE_,r31
CPSE HILFE_,FEHLER_ ;if hilfe = fehler
RJMP SCHLUSS
; hilfe = 0
LDI r31,$0
MOV HILFE_,r31
IN r31,PIND ; inbit taste2,d,5
ANDI r31,$20
MOV TASTE2_,r31
; gosub waehlen
RCALL waehlen
;endif
SCHLUSS: ;hilfe=0
LDI r31,$0
MOV HILFE_,r31
RET ;return
WAEHLEN: CP EHADR_,LANG_ ;if ehadr | lang
BRNE IF050
RJMP IF049E
IF050: RJMP ende ; goto ende
;endif
IF049E: CP ELADR_,KURZ_ ;if eladr | kurz
BRNE IF053
RJMP IF052E
IF053: RJMP ende ; goto ende
;endif
IF052E: ;begincase daten
CA0020: LDI r31,$40 ; case 64'Vorwärtslauf
CP DATEN_,r31
BREQ CN0009
CT0009:
RJMP CA0021
CN0009: SBI PORTB,$1 ; setbit b,1
RJMP ende ; goto ende
RJMP CA002X
CA0021: LDI r31,$41 ; case 65'Rückwärtslauf
CP DATEN_,r31
BREQ CN0010
CT0010:
RJMP CA002X
CN0010: CBI PORTB,$1 ; clrbit b,1
RJMP ende ; goto ende
;endcase
CA002X: LDI r29,$BF ;if daten > 191'Frequenzvorgabe
CP r29,DATEN_
BRLO IF056
RJMP IF055E
IF056: ; frequenz =daten
MOV r31,DATEN_
MOV FREQUENZ_,r31
RJMP ende ; goto ende
;endif
IF055E: LDI r29,$0 ;if frequenz = 0
CPSE FREQUENZ_,r29
RJMP IF058E
; frequenz = 200
LDI r31,$C8
MOV FREQUENZ_,r31
;endif
IF058E: ;daten=daten-128
MOV r31,DATEN_
LDI r29,$80
SUB r31,r29
MOV DATEN_,r31
LDI r31,$FF ;for hilfe = 0 to daten
MOV HILFE_,r31
FL007B: INC HILFE_
LDI r31,$4 ; toggle b,2
IN r30,PORTB
EOR r30,r31
OUT PORTB,r30
LDI r31,$1 ; pause frequenz
LDI r30,$FD
RCALL PSE_00
SEI
LDI r31,$4 ; toggle b,2
IN r30,PORTB
EOR r30,r31
OUT PORTB,r30
LDI r31,$1 ; pause frequenz
LDI r30,$FD
RCALL PSE_00
SEI
FL007N: CPSE HILFE_,DATEN_ ;next hilfe
RJMP FL007B
ENDE: RET ;return
EEPROM: RET ;return
.dseg
BYTE: .BYTE $6 ;..array space..BYTE@[]
.eseg
.exit
Und so sieht die automatisch erzeugte HEX Datei zum Brennen aus: KompilierenMarkierenSeparieren Leichter kann man Atmel Microcontoler nicht brennen.
Grüßle Georg |
| | | | |
| | | Also ich finde dieses Prinzip super optimal! |
| | | | |
| | GDL | Hallöle,
hier mal kurz ein Einblick in mein Hobby.
Mondautoprojekt : Entwicklung Schrittmotoransteuerung mit genormten DCC-Format
Beschreibung zum Bild :
1 = Schrittmotor 12Volt 1Ampere
2 = Wandlerplatine. Diese wandelt die PC RS232 Befehle in DCC Befehle um. Ebenso verstärkt sie die DCC Befehle, da aus den DCC Befehlen die Versorgungsspannung erzeugt wird. Ohne Sensorbussystem also ein 2 Leitungsbus für alle Module ohne Rückmeldung. In der Vollversion kommt ein 5Leitungsbus zum Einsatz.
3 = USB Mikrokontrollerbrenner. Atmel sind auch in der Schaltung programmierbar.
4 = Standardmodul für alle Anwendungen. Hier als Schrittmotordecoder programmiert. Was das Modul ansteuern soll, wird mittels Software geregelt. Auf dieser Platine fehlt noch der Schaltverstärker für den Motor. Da bin ich gerade drann.
=================================
Ein kleiner Einblick was GDL gerade so macht.
Grüßle Georg |
| | | | |
|
AntwortenThemenoptionen | 4.861 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |
|