Forum: Mikrocontroller und Digitale Elektronik Programm von atmega 8 auf atmega 16 umschreiben


von Ingo (Gast)


Lesenswert?

Wie muss ich das Programm  umschreiben das es auf dem ATmega 16
läuft????


Hier das Programm:


'----------------------------------------------------------------------- 
--------
'Projekt: USB_KIT
'Funktionsüberprüfung      11.11.2004
'Hardware:
'Aufgabe: Software zur Erstinbetriebnahme des AVR-Kits
'         dabei werden viele Funktionen getestet und dargestellt.
'         Erklärung der Anwendung in grünem Text.
'db100205,100505,250505,011105,230306,230606,050806
'----------------------------------------------------------------------- 
--------
'----------------------------------------------------------------------- 
--------
$regfile = "m8def.dat"                       'zu jedem Modell passende
Datei
$crystal = 8000000                           'Quarz (Resonator) Frequenz
$PROG &HFF,&HAE,&HD9,&H00                    'FuseBit auf Extern. Quarz
$baud = 9600                                 'gewünschte Bautrate
vorgeben

'Beispiel wie man den internen EEProm laden kann
$eeprom
Data "123456789012345"                       '1,15
Data "StarterKit V4.1"                       '16,31
Data "Timmy Fiola    "                       '32,47
Data "FV EL&IT Mainz "                       '48,63
Data "Stand: 23032006"                       '64,79
Data "Handwerkskammer"                       '80,95
Data "MultimediaGrimm"                       '96,111

'DatenDirektionRegister Port B
DdrB = 255                                   'alle PortB als Ausgang
deklarieren
PortB = 255                                  'alle PullUp ein.

DdrC = &B111_1111                            'das Gleiche mit Port C(nur
6-Byte)
PortC = &B111_1111
                                             'nur andere Schreibweise
DdrD = &B0011_1000                           'D4+5 für LCD-LED
Beleuchtung Outp.
PortD = &B1101_1111                          'PD4=H/PD5=L

Dim I As Integer                        'Variable für intern. Zähler vom
Timer
Dim D As Integer                             'eine Integer- Variable (D)
wird
                                            'dimensioniert.Der Inhalt
kann nun
                                          'während der Laufzeit
verändert werden
Dim Txt As String * 16                       'erstellen einer
String-Variablen
Dim W As Word                         'Word Variablen benötigen wenig
Speicher


Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PortB.1 , Db5 = PortB.2 , _
        Db6 = PortB.3 , Db7 = PortB.4 , E = PortB.0 , Rs = PortD.6
Initlcd
Cls
Cursor Off


Declare Function Eepromlesen(byval A As Word , Byval E As Word) As
String


Txt = EepromLesen(79 , 94) : Lcd Txt
Lowerline
Txt = EepromLesen(16 , 31) : Lcd Txt


Config Timer1 = Timer , Prescale = 64        '256 ist schneller
On Timer1 SprungTim1                         'Sprungadresse


Enable Interrupts

S1 Alias PinD.3                           'hier bekommen die Ports einen
selbst
S2 Alias PinD.4                           '-vormals D.6-
S3 Alias PinD.7                            'die Sufix aus der Zeichnung,
dann
S4 Alias PinD.2                            'hat man eine gute
Wiedererkennung.
V7 Alias PortC.2
V6 Alias PortC.1
V5 Alias PortC.0
V4 Alias PortB.5
Irs Alias PortC.1
'Ire Alias PortD.5                            'IR-Empfängerdiode
'-------------------nur Startbedingung testen und
ausgeben-------------------

Waitms 250                                   '1/4 Sekunde warten
Print Chr(13)                                'Zeilenumbruch 2x

Txt = EepromLesen(16 , 31) : Print Txt       'Text vom EEProm und
ausgeben
Txt = EepromLesen(32 , 47) : Print Txt       'Text vom EEProm und
ausgeben

Txt = EepromLesen(80 , 95) : Print Txt       'Text vom EEProm und
ausgeben
Txt = EepromLesen(64 , 79) : Print Txt       'Text vom EEProm und
ausgeben

Print "Registertest"

Print "B-Port: " ; Ddrb ; " / " ; Portb      'Registerinhalt darstellen
Print "C-Port: " ; Ddrc ; " / " ; Portc
Print "D-Port: " ; Ddrd ; " / " ; Portd
Print                                        'einfacher Zeilenumbruch
Waitms 500

Enable Timer1                                'Timer einschalten
V6 = 0
V5 = 0
V4 = 0

'----------------------------Hauptroutine------------------------------- 
-----
Do

  'Tasterabfrage mit Entprellung durch "Debounce"
  Debounce S1 , 0 , Tast1 , Sub           'S1
  Debounce S2 , 0 , Tast2 , Sub            'S2
  Debounce S3 , 0 , Tast3 , Sub            'S3
  Debounce S4 , 0 , Tast4 , Sub            'S4

  if S2 = 0 and S3 = 0 then Gosub TimEinAus

  'Hier werden Programmroutinen eingefügt.Diese Scheife wird ständig
wiederholt

Loop
'---------------------Ende der
Hauptroutine----------------------------------

'Alles an Programmiercode, was hiernach folgt, sind Nebenroutinen in die
der
'Mikrocontroller entweder von sich aus (Interrupt,Timer u.s.w) springt,
oder
'durch ein Ereignis (Debounce,Sub- oder Funktion u.s.w) ausgelöst wird.
Nach
'der Abarbeitung der Unterroutinen springt der Mikrocontroller immer
wieder
'an die Stelle zurück, von der aus er ausgetreten ist.

'---------------------Timer1
Ein/Aus-----------------------------------------
TimEinAus:

  If TIMSK.TOIE1 = 0 then    'ENABLE  Timer1
    TIMSK.TOIE1 = 1
  Else
    TIMSK.TOIE1 = 0
  End If
  waitms 1000
Return

'Hier ist die Timerroutine. Hier wird alle Sekunde hin verzweigt

SprungTim1:
  V7 = Not V7   'das ist ein genialer Befehl, Der den Zustand des Ports
einfach
                'umdreht. Also ist er eben Low, dann wird er High. Die
LED V7
                'wird also blinken. Vorausgesetzt der Port steht auf
Ausgang
                'und der PullUp- Widerstand ist eingeschaltet. Und der
Timer
                'ist enabled (eingeschaltet)
  Incr I       'Incrementiere I (Zähle um 1 höher entspricht: I=I+1)

  Print "033150:Timer";I   'das ist die Syntax um über UART seriell
Daten zu
                         'senden. das Semikolion trennt dabei die
Variable (i)
                         'vom geschriebenen Text. Print sendet dann den
Inhalt
                         'von (I)
  Ire = V7               'zum Testen der IR-Empfängerdiode

Return

'--------------------Tastenroutine-------------------------------------- 
------
Tast1:
  Incr D                                     'zählt die internen
Tastendrücke
  Txt = EepromLesen(64 , 79)                 'holt Text vom EEProm
(stand)
  Lowerline : Lcd Txt
  Print "S1: " ; Txt ; " z:" ; D             'Ausgabe über UART (TXD)
  V6 = Not V6                                'LED-Zustand umschalten
Return
'----------------------------------------------------------------------- 
------
Tast2:
  Txt = EepromLesen(32 , 47)                 'holt Text vom EEProm  (USB
onB..)
  Print "S2: " ; Txt                         'UART (TXD) Ausgabe
  Lowerline : Lcd Txt
  V4 = Not V4                                'LED V4 ändert seinen
Zustand
Return

'----------------------------------------------------------------------- 
------
Tast3:
  Txt = EepromLesen(48 , 63)                 'holt Text vom EEProm
(FV-EL..)
  Print "S3: " ; Txt                         'UART (TXD) Ausgabe
  Lowerline : Lcd Txt
  V7 = Not V7                                'LED V7 ändert seinen
Inhalt

Return
'----------------------------------------------------------------------- 
------
Tast4:
  Txt = EepromLesen(16 , 31)                 'holt Text vom EEProm
(USB-Kit..)
  Lowerline : Lcd Txt
  Print "S4: " ; Txt                         'UART (TXD) Ausgabe
  V5 = Not V5
Return

'----------------------------------------------------------------------- 
------
'Hier folgen Unterroutinen



'Aufgabe   : Das implementierte EEProm auslesen (512 Byte Größe
möglich),
'Parameter : A (Anfangspunkt) eine Zahl zwischen 1-511 - immer < E
'            E (Endpunkt) eine Zahl zwischen 2-512
'Ausgabe   : EEPromLesen (Stringvariable)
Function EepromLesen(byval A As Word , Byval E As Word) As String

  Local Epunkt As Word                       'Lokale Variablen werden
nach Ver-
  Local Inhalt As Byte                       'lassen der Routine wieder
frei
                                          'gegeben
  Eepromlesen = ""                           'Der Inhalt bleibt
bestehen, deshalb
   For Epunkt = A To E                       'erstmal löschen, dann for
- next
     Readeeprom Inhalt , Epunkt              'um EEProm schrittweise
(seriell)
     Eepromlesen = Eepromlesen + Chr(inhalt) 'aus zu lesen.
   Next Epunkt

End Function

von spess53 (Gast)


Lesenswert?

Hi

Wie groß ist den dein Verständnis für das Programm?

MfG Spess

von Ingo (Gast)


Lesenswert?

Wie soll ich diese Frage verstehen???

kann man das nicht einfach umschreiben für nen Atmega 16???

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Ingo wrote:
> Wie soll ich diese Frage verstehen???
>
die Frage war ziemlich eindeutig: Verstehst du, was das Programm macht 
und wie es funktioniert?

> kann man das nicht einfach umschreiben für nen Atmega 16???
>
wenn du obige Frage mit ja beanworten kannst, sollte es ein Leichtes 
sein, auch diese Frage zu beantworten und letztendlich das Programm 
umschreiben können...

Uwe

von spess53 (Gast)


Lesenswert?

Hi

Warum sol ich jemand einen Tip geben, wie sein Auto 100 Km/h schneller 
wird, wenn ich nicht weiss, ob er überhaupt fahren kann?

MfG Spess

von PeterL (Gast)


Lesenswert?

$regfile = "m8def.dat"
auf
$regfile = "m16def.dat"
ändern, das wars

von Ingo (Gast)


Lesenswert?

Okay

Also das Programm zeigt kurz beim einschalten des boards


Data "StarterKit V4.1"                       '16,31
Data "Stand: 23032006"                       '64,79

im Display an.

Danach zeigt es nur noch den Namen an und Handwerkskammer und in der 
Ecke erscheint ein Zähler der von 1 anfängt hoch zu zählen.
Wenn ich die R Taste drücke wird das Komplette Board neugestartet also 
wird wieder der obige Text ausgegeben und danach fängt der Zähler wieder 
bei 1 an zu zählen. Drücke ich eine der Anderen Tasten sehe 
Multimedieagrim.

Das ist das was ich weiß über das Programm. An sonsten ist das nur eine 
Testsoftware die während der Prüfung aufgespielt wurde um die Funktion 
des Boards zu bestätigen. Da ich aber noch kein Eigenes Programm 
geschrieben habe wäre ich happy wenn das Board nicht einfach nichts tut 
wenn ich es einschalte sondern dieses Programm wiedergibt.

Hoffe konnte damit helfen??!!

Viele Grüße

Ingo

von Ingo (Gast)


Lesenswert?

$regfile = "m8def.dat"
auf
$regfile = "m16def.dat"
ändern, das wars

hab ich schon versucht passiert nichts kann es sein das ich die fuses 
erst ändern muss das das Programm läuft?? wenn ja wie ändere ich sie ab 
hab die Angabe das sie 1110:1110 sein sollen. Das soll auch über die 
Bascom Software gehen aber ich kann diesen Zahlenwer nigendwo einstellen 
oder doch???

von PeterL (Gast)


Lesenswert?

also wenn du schon eine Anzeige hast, hast du es ja schon fast 
geschafft:

mit LCD xxx (im Bascom gibts eine Helpfunktion) kann man sich alles 
mögliche anzeigen lassen (Variablen, Texte usw.)

von Ingo (Gast)


Lesenswert?

Meine Anzeige sieht zur Zeit so aus das mein 1*16 Zeilendisplay die 
erste Zeile nur Rechtecke angezeigt werden in der 2. Zeile ist nichts. 
Das selbe macht er auch wenn der Atmega leer ist....  Oder habe ich dich 
jetzt falsch verstanden??

von Ingo (Gast)


Lesenswert?

Außerdem sagt mir Bacom immer wieder wenn ich das Flashen beginnen will 
das die software und der Ausgewählte chip nicht übereinstimmen woran 
kann das noch liegen??

von Peter D. (peda)


Lesenswert?

Grob gesagt gibt es 4 Baustellen, wo man den Typ angeben muß:

1. Dem Compiler, damit er weiß, was fürn Code er generieren muß

2. Dir selbst, damit Du die vordefinierten Namen verwenden kannst, also:
$regfile = "m8def.dat"

3. Dem Programmer, damit er weiß, welchen Programmieralgorithmus er 
einstellen muß.

4. Der Code, wenn Sachen verwendet werden, die unterschiedlich sind 
(Timer usw.).
Ist aber bei Mega8 -> Mega16 kaum zu erwarten, die sind sich sehr 
ähnlich.


Peter

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
Noch kein Account? Hier anmelden.