Hallo, ich versuche gerade eine bestehende SW von Attiny 2313 auf Atmega88 zu portieren. Code ist in Basic aber mit einigem an Inline Assembler. Ich gebe die korrekte Definitionsdatei $regfile = "m88def.dat " an und bekomme dann beim Compilieren folgenden Fehler: Variable can not be used with SET [TIFR] an folgender Stelle im Unterprogramm: Wait_and_clear: Wait 1 Home L Lcd Spc(16) * Set Tifr.tov1 Ich wundere mich ein wenig, fa der Compiler ja durch die Definitionsdatei die Korrekten Registeradressen setzen sollte. Der AT88 kann, soweit ich das momentan überblicke, bezüglich der Features ja einen Attiny 2313 ersetzen ? Oder übersehe ich hier etwas ? Danke DS
weil der mega88 mehrere tifr register hat. tifr0, tifr1
Andere Stellen im (Elektor) Code generieren aber keinerlei Fehler.
Das kann es doch dann nicht sein ?
$crystal = 20000000
$regfile = "m88def.dat "
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Timer0_mode As Byte , Period As Long , Cnt As Byte
Dim Cal_flag As Eram String * 4 , Period_c0 As Eram Long , Period_ref As
Eram Long
Dim Capacity As String * 8
On Int0 Int0_sub Nosave
On Int1 Int1_sub Nosave
Config Clockdiv = 1
Config Portd = &B00110000
'Pind.0 = Input 'S1: calibrate
'Pind.2 = Input 'signal input (from oscillator); Int0
'Pind.3 = Input 'signal input (from oscillator); Int1
'Pind.4 = Output 'oscillator control (reset)
'Pind.5 = Output 'OC0B out -> T1 in (internal connection; do not
connect outside!)
Portd = &B00010001 'switch on
pull-up on PD0 input & start 555
S1 Alias Pind.0
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 ,
Db4 = Portb.4 , E = Portb.2 , Rs = Portb.1
Cursor Off
Cls
Lcd "Elektor pico C"
Config Int0 = Falling
Config Int1 = Falling
Ocr0b = 255
Config Timer0 = Timer , Prescale = 1 , Compare B = Toggle , Clear Timer
= 0
Timer0_mode = Tccr0b
Stop Timer0
Config Timer1 = Counter , Edge = Falling
Enable Interrupts
Capacity = Cal_flag
If Capacity <> "EEpC" Then Gosub Calibrate_1
Do
Debounce S1 , 0 , Calibrate , Sub
Gosub Measure
sbic tifr,tov1 'If
Tifr.tov1 = 0 Then
rjmp skip_disp
Period = Period - Period_c0
If Period <= 214748 Then 'Prevent
calculation overflow
Period = 10000 * Period
Period = Period / Period_ref
Capacity = Str(period)
Home L
Lcd "Cx=" ; Format(capacity , " 0.0") ; "pF"
Else
Gosub Disp_error_message 'Error: C>>
End If
Skip_disp: 'End If
Gosub Wait_and_clear
Loop
Measure:
in r24,tccr0b 'If
Pind.5(=OC0B) = 1 then force compare match to clear OC0B
sbr r24,$40
Sbic Pind , 5
!out tccr0b,r24
clr r24
!out tcnt0,r24 'Timer0 = 0
!out tcnt1h,r24 'Timer1 = 0
!out tcnt1l,r24
in r24,tifr
ori r24,$EF 'clear
Timer0&Timer1 pending interrupts
!out eifr,r24
in r24,eifr
ori r24,$C0 'clear
Int0&Int1 pending interrupts
!out eifr,r24
in r24,gimsk
ori r24,$40 'Enable Int0
(start measurement)
!out gimsk,r24
Measure_loop: 'Loop until
in r24,gimsk '
interrupts are disabled
andi r24,$C0 '
(measurement finished) or
breq Measure_ok ' Timer1
overflow flag is set
sbis tifr,tov1 '
(measurement lasts too long)
rjmp Measure_loop
Measure_error: 'Measure
error: C>>
ldi r24,0
!out TCCR0B,r24 ' Stop
Timer0
in r24,gimsk
andi r24,$3f ' Disable
Int0&Int1
!out gimsk,r24
Disp_error_message: ' Display
error message
Home L
Lcd "Error: C>>"
Return
Measure_ok: 'Measurement
finished OK
in r24,tcnt0 ' Period =
(Timer1*512+OC0B*256+Timer0)/8
Lsr r24
sbic pind,5
sbr r24,$80
in r25,tcnt1l
in r26,tcnt1h
lsr r26
ror r25
ror r24
lsr r26
ror r25
ror r24
sts {period+0},r24
sts {period+1},r25
sts {period+2},r26
clr r24
sts {period+3},r24
Return
Calibrate:
For Cnt = 1 To 100
Waitms 20
If S1 = 1 Then Return
Next
Calibrate_1:
Home L
Lcd "Cal:"
Bitwait S1 , Set
Lcd "C=0pF (S1)"
Gosub Wait_s1
Gosub Measure
sbic tifr,tov1 'If Timer1
overflow flag is set then exit Calibrate
rjmp wait_and_clear
Period_c0 = Period
Home L
Lcd "Cal: C=1nF"
Gosub Wait_s1
Gosub Measure
sbic tifr,tov1 'If Timer1
overflow flag is set then exit Calibrate
rjmp wait_and_clear
Period = Period - Period_c0
Period_ref = Period
Home L
Lcd "Calibrated" ; Spc(6)
Cal_flag = "EEpC"
Wait_and_clear:
Wait 1
Home L
Lcd Spc(16)
Set Tifr.tov1
Return
Wait_s1:
Do
Debounce S1 , 0 , Wait_s1_ex
Loop
Wait_s1_ex:
Return
Int0_sub:
push r24
in r24,sreg
push r24
ldi r24,24 'repeat
measurement 24x
sts {cnt},r24
Nop
Nop
Nop
lds r24,{timer0_mode} 'Start
Timer0
!out tccr0b,r24
in r24,gimsk
andi r24,$3f 'Disable
Int0
ori r24,$80 'Enable Int1
!out gimsk,r24
in r24,eifr
ori r24,$C0 'clear Intf1
and Intf0 (clear pending external interrupts)
!out eifr,r24
Int0_ex:
pop r24
!out sreg,r24
pop r24
Return
Int1_sub:
push r24
in r24,sreg
push r24
lds r24,{cnt} 'count
measuremens
dec r24
sts {cnt},r24
brne Int1_ex 'allow 24
measurements before finished
ldi r24,0
!out TCCR0B,r24 'Stop Timer0
in r24,gimsk
andi r24,$7f 'Disable
Int1
!out gimsk,r24
Int1_ex:
pop r24
!out sreg,r24
pop r24
Return
Na Du bist mir ja ne echte Hilfe ;-) Dann gib doch bitte mal etwas sachdienlichere Hinweise. tifr0 oder tifr1 kennt der Compiler nicht ;-(...
Doch die gibt es. Das ist leicht nachprüfbar:
1 | $crystal = 20000000 |
2 | $regfile = "m88def.dat " |
3 | $hwstack = 40 |
4 | $swstack = 16 |
5 | $framesize = 32 |
6 | |
7 | Set Tifr1.tov1 |
Attiny2313 schrieb: > Ich gebe die korrekte Definitionsdatei $regfile = "m88def.dat " In älteren Bascom-Versionen war der Compiler sehr pingelig bezüglich der µC-Typdefinition. Warum da ein Leerzeichen drinstehen soll, weis außer Dir niemand.
> Set tifr1.tov1 führt zu gleichem Fehler.. Dann hast du die Änderung nicht richtig gemacht. Wenn der gleiche Fehler wie in Beitrag "Hilfe bei SW Portierung AT2313 auf Atmega 88" kommt, also "Variable can not be used with SET [TIFR]..." sieht der Compiler weiterhin ein TIFR statt einem TIFR1. Wenn du die Fehlermeldung "Variable can not be used with SET [TIFR1]..." bekommst, hast du ein Problem mit dem $regfile = "m88def.dat". Bei meiner uralten Demoversion 1.11.9.8 gibt es beim Code aus Beitrag "Re: Hilfe bei SW Portierung AT2313 auf Atmega 88" keine Probleme.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.