doch, in meiner kochbuchversion [Stand: 20. September 2009] stehen die in jedem programm.
ich hab es inzwischen ohne die zeilenzahlen im programmcode hinbekommen das hex file in boscom zugenerieren und es mit avr studio zu übertragen.
jetzt kann ich endlich richtig anfangen.
ich hab gestern mal noch ein paar programme getestet und die haben eigentlich alle funktioniert.
dann hab ich mich an das programm von schittlerwiller aus dem 144seiten fred gemach. es geht dabei um diesen code
Code:
'============================================================
'
' ***********************************************************
' *** ***
' *** Reaktiv-Tiny v0.5 2006-02-25 (AP) ***
' *** ***
' *** Morsecodeabfrage eines Morsezeichens mit ***
' *** anschließender Ausgabe von bis zu 64 Morsezeichen. ***
' *** Es können Koordinaten oder beliebiger Text ***
' *** ausgegeben werden. ***
' *** Die Eingabegeschwindigkeit wird mit der ersten ***
' *** empfangenen Zeichenlänge bestimmt ***
' *** ***
' *** ***
' *** --------------- Einstellungen --------------------- ***
' *** ***
' *** Fusebit H: 0 ***
' *** Fusebit G: 0 ***
' *** Fusebit F: 1 ***
' *** Fusebit E: 1 ***
' *** Fusebit DCBA: 1011 ***
' *** ***
' *** Beachtet das Fusebit G. Es muss auf 0 stehen! ***
' *** ***
' *** Unter 'Options' ' Compiler' 'Chip' ***
' *** den "HW Stack" runterstellen. z.B. auf 6 ***
' *** ***
' ***********************************************************
'
' µC: ATtiny13V
'
'============================================================
'
$regfile = "ATtiny13.DAT"
$crystal = 113000 'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 6
'
Config Portb = &B00011000 'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111 'Pullups zuschalten, außer für Pinb.3 und .4
'
Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
'
'
'Anmerkung zur Deklaration: bin sparsam mit den Variablen umgegangen,
'd.h. diese werden zum Teil im Programm mehrfach für verschiedene Aufgaben verwendet.
'Grund: ich kenne das "Drosseln" des HW Stack erst seit es hier im Fred stand. Dank an Gonzoarts.
Dim Hell As Bit
Dim Vhell As Bit
Dim Ok As Bit
Dim A As Byte
Dim B As Byte
Dim Ein As Integer
Dim Bx As Byte
Dim Z As Byte
Dim D1 As Byte
Dim D2 As Integer
'
'
'
'
' Es können alle Buchstaben und Zahlen gesendet werden, da diese maximal 5 Zeichen lang sind.
' Ausgabe der Zeichen aus dem EEPROM mit Länge
'
'
'
' dit = kurz = . = 0
' dah = lang = - = 1
'
'
' 765 43210
' \_/ \___/
' | |
' Länge |
' |
' Morsezeichen v.rechts (rückwärts)
'
' Morse Bit v.r.
'1 = .---- = 100|11110
'2 = ..--- = 100|11100
'3 = ...-- = 100|11000
'4 = ....- = 100|10000
'5 = ..... = 100|00000
'6 = -.... = 100|00001
'7 = --... = 100|00011
'8 = ---.. = 100|00111
'9 = ----. = 100|01111
'0 = ----- = 100|11111
'
'N = -. = 001|00010
'E = . = 000|00000
'
'KA (Spruch Anfang) = -.-.- = 100|10101
'AR (Spruch Ende) = .-.-. = 100|01010
'
'Wortabstand einfügen mit 111|11111 (FF)
'
'
' Übertragungsrate
' 1 WPM: 1 dit = 1200 ms
' 5 WPM: 1 dit = 240 ms
'10 WPM: 1 dit = 120 ms
'20 WPM: 1 dit = 60 ms
'
'
'==> Übertragungsrate festlegen, hier 5 Wörtern pro Minute (WPM)
D1 = 240 'D1 entspricht der Länge eines dit in Millisekunden
D2 = 480 'D2 entspricht der doppelten Länge eines dit
'
'==> Abgefragtes Zeichen festlegen
Ein = &B0000000000111000 'Beispiel: SOS ...---...
'
'
Ok = 1
Gosub Morsen 'beim Start das ganze mal testweise Morsen
'
' Morsezeichen - Abfrage:
Do
Gosub Led_abfrage
If Hell = 1 Then Vhell = 1 'Bei Licht Merker setzen
If Vhell = 1 And B < 255 Then B = B + 1 'Wenn Merker gesetzt wurde, Zähler für Lichtdauer erhöhen (bis max. 255)
If Hell = 0 Then
If Vhell = 1 Or B = 255 Then 'Übergang zu Dunkel
If Z = 0 Then
Ok = 1 'Neues Spiel, neues Glück
'Festlegen der Grenzdauer. Diese entscheidet, ob ein dit oder dah eingegeben wurde.
'==> Leider muss man hier "von Hand" eintragen, ob das erste Zeichen dit oder dah ist. Bei dit B), bei dah A) auskommentieren
'Die benötigte If-Abfrage hat im 1k Programmspeicher des ATtiny13V keinen Platz mehr.
'A) erstes abgefragtes Zeichen ist ein dit
If B < 127 Then 'A) dies sollte nicht zu lange sein
Bx = B * 1.7 'A) Grenzdauer Bx durch Länge des ersten dit festlegen
Else 'A)
Ok = 0 'A) das war zu lange fürs erste dit
End If 'A)
'B) erstes abgefragtes Zeichen ist ein dah
' Bx = B / 2 'B) Grenzdauer Bx durch Länge des ersten dah festlegen
End If
If B < Bx Then
If Ein.z = 1 Then Ok = 0 'dit empfangen, wenn Ein.z = 0, dann richtig
Else
If Ein.z = 0 Then Ok = 0 'dah empfangen, wenn Ein.z = 1, dann richtig
End If
Z = Z + 1
If Z = 9 Or Ok = 0 Then 'Auswerten wenn Falsch ODER Anzahl Zeichen erreicht
Gosub Morsen '==> Z auf die Anzahl abgefragter Zeichen einstellen
End If
End If
End If
If Hell = 0 Then 'Bei Dunkelheit Merker und Zähler für Lichtdauer löschen
Vhell = 0
B = 0
End If
Loop
Morsen:
Waitms 500 'Pause, sonst ist das erste Zeichen schwer zu lesen
If Ok = 1 Then 'Morsezeichen senden
For Bx = 0 To 36 '=> Länge anpassen!
Readeeprom A , Bx 'in A steht der zu morsende Code (Bit 0 bis 4 dit und dah, Bit 5 bis 7 die Anzahl
Z = 0
Z.0 = A.5 'Zeichenlänge steht in den vorderen 3 Bit (A.5 bis 7)
Z.1 = A.6
Z.2 = A.7
If Z = 7 Then 'bei FF einen Wortabstand einfügen (4dit = 7dit - 3dit)
Waitms D2
Waitms D2
Else 'Zeichenlänge: 1 bis 5 (0 bis 4)
Gosub Licht
End If
Next Bx
Else ' IRRUNG senden
If B < 255 Then ' aber nicht, wenn die Dämmerung eintritt bzw. ein langes Lichtsignal anlag
Z = 7
A = 0 ' Irrung = ........ = 0
Gosub Licht
End If
End If
'A = 0
B = 0
Z = 0
Return
Licht:
For B = 0 To Z
Portb.3 = 1 'LED an
Waitms D1 '1 . dit
If A.b = 1 Then
Waitms D2 '3 - dah
End If
Portb.3 = 0 'LED aus
Waitms D1 '1 dit Pause
Next B
Waitms D2 '+2 dit Pause nach Ziffer
Return
Led_abfrage:
Portb.3 = 0 'Portb.3 auf Masse schalten
Portb.4 = 1 'Portb.4 auf +Ub schalten, um die LED zu 'laden'
Waitus 1 'Ladezeit 1 µs, kann ggf. noch verkleinert werden
Config Portb.4 = Input 'Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
Portb.4 = 0 'Pullup abschalten, sonst geht's nicht!
Waitms 20 'Entladezeit 20 ms - je größer, desto weniger Licht genügt (je kleiner, je unempfindlicher)
If Pinb.4 = 0 Then 'Ladezustand einlesen: '1' -> dunkel, '0' -> hell
Hell = 1
Else
Hell = 0
End If
Config Portb.4 = Output 'Portb.4 wieder auf Ausgang schalten
Portb.4 = 0 'Portb.4 auf Masse schalten
Return
End
damit das funktioniert muss ich ja das eeprom mit folgendem code beschreiben.
Code:
'============================================================
'
' ***********************************************************
' *** ***
' *** Reaktiv-Tiny EEPROM schreiben 2006-02-25 (AP) ***
' *** ***
' *** ***
' *** Beachtet das Fusebit G. Es muss auf 0 stehen! ***
' *** ***
' *** Fusebit H: 0 ***
' *** Fusebit G: 0 ***
' *** Fusebit F: 1 ***
' *** Fusebit E: 1 ***
' *** Fusebit DCBA: 1011 ***
' *** ***
' *** ***
' ***********************************************************
'
' µC: ATtiny13V
'
'============================================================
'
$regfile = "ATtiny13.DAT"
$crystal = 113000 'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 6
'
'Config Portb = &B00011000 'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
'Portb = &B11100111 'Pullups zuschalten, außer für Pinb.3 und .4
'
Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
'
'
Dim A As Byte
'
'
'--------------------------------------------------------------
' Bitwert 0=dit, 1=dah
' das Byte von rechts lesen, da Schleife von 0 bis z läuft
' z ist die Zeichenlänge minus eins, die in den oberen 3 Bit festegelgt wird
'
' Morse Bit v.r. Hex Dec
'1 = .---- = 100|11110 1 9E 158
'2 = ..--- = 100|11100 2 9C 156
'3 = ...-- = 100|11000 3 98 152
'4 = ....- = 100|10000 4 90 144
'5 = ..... = 100|00000 5 80 128
'6 = -.... = 100|00001 6 81 129
'7 = --... = 100|00011 7 83 131
'8 = ---.. = 100|00111 8 87 135
'9 = ----. = 100|01111 9 8F 143
'0 = ----- = 100|11111 0 9F 159
'
'N = -. = 001|00001 N 21 33
'E = . = 000|00000 E 00 0
'
' Pause = 111|11111 0 FF 255
'
' KA (Spruch Anfang) = -.-.- = 100|10101 95 149
' AR (Spruch Ende) = .-.-. = 100|01010 8A 138
'
'
'
'Wortabstand == FF
'H = .... = 011|00000 H 60 96
'A = .- = 001|00010 A 22 34
'P = .--. = 011|00110 P 66 102
'P .--. = 011|00110 P 66 102
'Y = -.-- = 011|01101 Y 6D 109
'Wortabstand == FF
'H = .... = 011|00000 H 60 96
'U = ..- = 010|00100 U 44 68
'N = -. = 001|00001 N 21 33
'T = - = 000|00001 T 01 1
'I = .. = 001|00000 I 20 32
'N = -. = 001|00001 N 21 33
'G = --. = 010|00011 G 43 67
'Wortabstand == FF
'Ende 8A
'
'
'
'=============================================
' Beispiel Cache: N49.12.345 E008.56.789
'=============================================
'
'
A = &B11111111 ' Pause
Writeeeprom A , 0
A = &B10010101 ' KA (Spruch Anfang) = -.-.-
Writeeeprom A , 1
A = &B11111111 ' Pause
Writeeeprom A , 2
A = &B00100001 ' N = -.
Writeeeprom A , 3
A = &B10010000 ' 4 = ....-
Writeeeprom A , 4
A = &B10001111 ' 9 = ----.
Writeeeprom A , 5
A = &B10011110 ' 1 = .----
Writeeeprom A , 6
A = &B10011100 ' 2 = ..---
Writeeeprom A , 7
A = &B10011000 ' 3 = ...--
Writeeeprom A , 8
A = &B10010000 ' 4 = ....-
Writeeeprom A , 9
A = &B10000000 ' 5 = .....
Writeeeprom A , 10
A = &B11111111 ' Pause
Writeeeprom A , 11
A = &B00000000 ' E = .
Writeeeprom A , 12
A = &B10011111 ' 0 = -----
Writeeeprom A , 13
A = &B10011111 ' 0 = -----
Writeeeprom A , 14
A = &B10000111 ' 8 = ---..
Writeeeprom A , 15
A = &B10000000 ' 5 = .....
Writeeeprom A , 16
A = &B10000001 ' 6 = -....
Writeeeprom A , 17
A = &B10000011 ' 7 = --...
Writeeeprom A , 18
A = &B10000111 ' 8 = ---..
Writeeeprom A , 19
A = &B10001111 ' 9 = ----.
Writeeeprom A , 20
A = &B11111111 ' Pause
Writeeeprom A , 21
A = &B01100000 ' H = ....
Writeeeprom A , 22
A = &B00100010 ' A = .-
Writeeeprom A , 23
A = &B01100110 ' P = .--.
Writeeeprom A , 24
A = &B01100110 ' P = .--.
Writeeeprom A , 25
A = &B01101101 ' Y = -.--
Writeeeprom A , 26
A = &B11111111 ' Pause
Writeeeprom A , 27
A = &B01100000 ' H = ....
Writeeeprom A , 28
A = &B01000100 ' U = ..-
Writeeeprom A , 29
A = &B00100001 ' N = -.
Writeeeprom A , 30
A = &B00000001 ' T = -
Writeeeprom A , 31
A = &B00100000 ' I = ..
Writeeeprom A , 32
A = &B00100001 ' N = -.
Writeeeprom A , 33
A = &B01000011 ' G = --.
Writeeeprom A , 34
A = &B11111111 ' Pause
Writeeeprom A , 35
A = &B10001010 ' AR (Spruch Ende) = .-.-. =
Writeeeprom A , 36
End
ich kann aber meinen avrisp mk2 unter boscom nicht richtig benutzen und bekomme deshalb über boscom das eeprom nicht richtig beschrieben.
unter avr studio gibt es die option ein hex file auf das eeprom zu brennen.
wenn ich aber ein in boscom compilliertes hex file mit dem programm für der eeprom versuche, bekomme ich diese fehlermeldung:
"the contents of the HEX file does not fit in the selected devide"
mir ist bewusst das ich hier jetzt schon wieder eine völlig neue baustelle aufmache, aber warscheinlich hab ich nur wieder irgendwelche zahlem mit kopiert und ich blamier mich hier wieder. wie müsste ich das hex file in boscom denn erstellen um es in avr studio ins eeprom zu brennen oder kann es auch an irgendwelchen nicht richtig gesetzten fusebits liegen, die bezeichnungen fusebit G existieren in avr studio nämlich leider nicht und ich muss mir immer die beschreibung der fusebits in boscom durchlesen und dann vergleichen welche beschreibung in avr studio dem am nächsten kommt?
nochmal vielen, vielen dank für eure hilfe und eure geduld mit mir.