- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 3 von 3

Thema: Kann *.hex nicht auf Chip brennen andere *.hex Dateien schon

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    39
    Beiträge
    289

    Kann *.hex nicht auf Chip brennen andere *.hex Dateien schon

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    hab da ein ziemlich dummes Problem.
    Hab ein Programm geschrieben, was ich nun auf meinen Atmega8L brennen wollte. TwinAVR meldet mir dann aber bei "66 of 73 Instructions" --> Flash memory write error"
    Das komische ist aber, dass ich andere Programme noch wunderbar draufbrennen kann. Also kann es ja schonmal nicht am Chip liegen denk ich (der ist ja auch neu).
    Hier mal der Code:
    Code:
    ;Dieses Programm produziert ein Lauflicht. Jede halbe Sekunde geht die
    ;nächste LED an. Drückt man den Taster, ändert sich die Richtung des Lauflichtes
    ;Das Programm läuft in einer Endlosschleife durch.
    ;Problem des Prellens soll hier nicht mehr auftreten.
    .include "m8def.inc"
    
    .equ time1 = 65536-1				;Damit wird der Timer1 vorgeladen, für 100ms
    .equ Taster = PD2					;Taster an D.2
    .equ sperre = 7						;Taster sperren (Hilfsvariable)
    .equ laufrichtung = 0
    
    .def tmp = r16						;Mein Universallregister
    .def statusLED = r17				;In diesem Register wird gespeichert, welche LED gerade leuchtet
    .def statusTaster = r18				;Statusregister, wo die Sperre gespeichert ist
    .def zaehler = r19					;Mein Zählregister, hier zähl ich hoch,
    									;damit ich auf eine halbe Sekunde komme
    
    .org 0x000
    	rjmp reset						;Interruptvektor "reset:"
    
    .org OVF1addr
    	rjmp zeitum						;Interruptvektor für Timer1 Überlauf
    
    reset:
    	;Stack einrichten
    	ldi tmp, HIGH(RAMEND)			;HIGH-Byte der obersten RAM-Adresse
    	out SPH, tmp
    	ldi tmp, LOW(RAMEND)			;LOW-Byte der obersten RAM-Adresse
    	out SPL, tmp
    
    	ldi tmp, 0b11111111
    	out DDRB, tmp					;PortB als Ausgang
    
    	sbi PIND, Taster					;D.2 Pullups aktivieren	
    	cbi PIND, Taster				;D.2 als Eingang
    
    	ldi statusLED, 0b00000100
    	out PORTB, statusLED			;Am Anfang soll erste LED leuchten
    
    	ldi zaehler, 0b00000000			;Zähler auf 0 stellen
    
    	;Timer Register für 100ms werden belegt, hier Timer1
    	ldi tmp, (1<<CS12) | (1<<CS10)	;Prescaler ist 1024
    	out TCCR1B, tmp
    	ldi tmp, HIGH(time1)			;Für den Timer1 (16Bit) benötigen
    	out	TCNT1H, tmp					;wir 2 Register, in denen wir den Wert
    	ldi tmp, LOW(time1)				;für die 1/2 speichern ->
    	out TCNT1L, tmp					;"TCNT1H" und TCNT2L"
    	ldi tmp, (1<<TOIE1)
    	out TIMSK, tmp
    
    	sei								;Interrupts zulassen
    
    main:
    	cpi zaehler, 0b00000101			;Ist zaehler = 5?
    	breq lauflicht					;JA -> springe zu lauflich
    	rjmp main						;NEIN -> springe zu main
    
    lauflicht:
    	clr zaehler						;zaehler auf 0 setzen
    	sbrs statusTaster, laufrichtung	;Ist Bit0 = 1?
    	rjmp pruefRechts				;NEIN -> laufe rechtsrum
    									;JA -> lauf linksrum
    pruefLinks:
    	cpi statusLED, 0b00000100		;Leuchtet 3. LED?
    	breq wiederholenLinks			;Wenn JA, spring zu "wiederholen"
    	lsl statusLED					;Wenn NEIN´, Bit nach links verschieben -> nächste LED
    	rjmp ende						;spring zu ende
    
    pruefRechts:
    	cpi statusLED, 0b00000001		;Leuchtet 1. LED?
    	breq wiederholenRechts			;Wenn JA, spring zu "wiederholen"
    	lsr statusLED					;Wenn NEIN, Bit nach rechts verschieben -> vorherige LED
    	rjmp ende						;spring zu ende
    
    wiederholenLinks:
    	ldi statusLED, 0b00000001
    	rjmp ende
    
    wiederholenRechts:
    	ldi statusLED, 0b00000100
    
    ende:
    	out PORTB, statusLED			;nächste LED leuchtet
    	rjmp main						;springe wieder zur main
    
    ;*****************INTERRUPTROUTINE FÜR TIMER1***************************
    zeitum:
       	push tmp                  		;Rette Universallregister
       	out SREG,  tmp               	;Rette Statusregister
       	push tmp
    	inc zaehler						;Zähler erhöhen
    
       	sbis PIND, Taster           	;Ist Taste gedrückt?
       	rjmp zeitum1               		;NEIN -> springe zu zeitum1
    
    zeitum0:                     		;JA -> hier weiter machen
       	sbrs statusTaster, sperre      	;Ist Sperre gesetzte?
       	rjmp zeitum2               		;NEIN -> springe zu zeitum1
       	rjmp zeitum3               		;JA -> springe zu zeitum2
    
    zeitum1:
       	cbr statusTaster, (1<<sperre)	;Sperre löschen
       	rjmp zeitum3
    
    zeitum2:
    	sbr statusTaster, (1<<sperre)      	;Sperre setzen
    
       	;Aktion durchführen die beim Drücken des Tasters passieren soll
    	sbrs statusTaster, laufrichtung	;Ist Bit0 = 1?
    	rjmp setzeBitLauf				;NEIN -> auf 1 setzen
    	cbr statusTaster, (1<<laufrichtung);JA -> auf 0 setzen
    	rjmp zeitum3					;Ende der Routine
    
    setzeBitLauf:
    	sbr statusTaster, (1<<laufrichtung)
    
    zeitum3:
    	;Timer1 neu laden
    	ldi tmp, HIGH(time1)
    	out	TCNT1H, tmp
    	ldi tmp, LOW(time1)
    	out TCNT1L, tmp
    
        pop tmp                       	;stelle SREG wieder her
        out SREG, tmp
        pop tmp                       	;stelle Universalregister wieder her
        reti                          	;die Interrupt-Routine wird verlassen
                                     	;und es wird weiter im Hauptprogramm gearbeitet
    An was kann das denn noch alles liegen?

    Sagt mir nun bitte nicht, dass ich mal PonyProg oder yaap benutzen soll, diese beiden Programme gingen von Anfang an nicht, auch nicht mit dem alten Chip.

    Ich hoffe ihr könnt mir weiterhelfen, denn ich bin kurz vor der Verzweiflung

    Gruß
    Thomas

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    03.12.2004
    Ort
    Niederbayern
    Alter
    39
    Beiträge
    248
    Hab ich auch mal gehabt, da war aber meine Versorgungsspannung nicht in ordnung (zu klein). ist bei dir das alles OK?

    Bernhard

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    39
    Beiträge
    289
    Hi,

    das Problem hat sich mittlerweile erledigt. Hatte Patchkabel von den Pins zu LEDs und Summer noch verbdunden. Und ich hatte nur das LPT-Kabel am Rechner, also ohne externes Netzteil. Wusste das noch nicht, aber nun geht alles wunderbar. Muss eben noch extra ein Netzteil dazu schalten

    Trotzdem Danke für die Antwort.

    Gruß
    Thomas

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad