Forum: Mikrocontroller und Digitale Elektronik Assembler Code macht MC defekt?


von Willi W. (qwertzinger)


Lesenswert?

Hallo, immer nachdem in folgenden Programmcode in den MC geladen habe, 
kann ich keinen weiteren Programmcode mehr in den MC uploaden. 
Normalerweise kann man ja einen MC x-beliebige mal wieder beschreiben. 
Ich hab nun einen neuen. Des Programmcode upgeloaded. Das geliche 
Problem. Kann nix mehr uploaden.

Das Programm soll eine Binärzahl in ein Schieberegister einlesen!

MC = Attiny13
Programmierplattform: Atmel Studio 4
(aus Franzis Lernpaket)

Hier der Code:
1
.include "tn13def.inc"
2
3
rjmp Anfang
4
Anfang:
5
6
.def temp1 = r16
7
.def temp2 = r17
8
 
9
.equ SCHIEBE_DDR  = ddrb
10
.equ SCHIEBE_PORT = portb
11
.equ RCK          = 3
12
.equ SCK          = 1
13
.equ SCL          = 2
14
.equ SIN          = 0
15
 
16
    ldi   temp1, LOW(RAMEND)     ; Stackpointer initialisieren
17
    out   SPL, temp1
18
19
 
20
;
21
; Die Port Pins auf Ausgang konfigurieren
22
;
23
   ; ldi   temp1, (1<<RCK) | (1<<SCK) | (1<<SCL) | (1<<SIN) ; Anm.1
24
   ; out   SCHIEBE_DDR, temp1
25
26
  sbi   SCHIEBE_DDR,RCK
27
  sbi   SCHIEBE_DDR,SCK
28
  sbi   SCHIEBE_DDR,SCL
29
  sbi   SCHIEBE_DDR,SIN
30
31
;
32
; die Clear Leitung am Schieberegister auf 1 stellen
33
;
34
    sbi   SCHIEBE_PORT, SCL
35
 
36
;
37
; Ein Datenbyte ausgeben
38
;
39
 loop:   
40
  ldi   temp1, 0b11010110
41
    rcall Schiebe
42
    rcall SchiebeOut
43
 
44
45
    rjmp  loop
46
 
47
;-----------------------------------------------------------------------------
48
;
49
;Kurze Pause erzeugen
50
;
51
SchiebeOut:
52
  ldi r18,1
53
Warten_an1:
54
  ldi r19,255
55
Warten_an2: 
56
  ldi r20,255
57
Warten_an3:
58
  dec r20 
59
  brne Warten_an3
60
  dec r19
61
  brne Warten_an2
62
  dec r18
63
  brne Warten_an1
64
    ret
65
 
66
;-----------------------------------------------------------------------------
67
;
68
; 8 Bits aus temp1 an das Schieberegister ausgeben
69
Schiebe:
70
    push  temp2
71
    ldi   temp2, 8             ; 8 Bits müssen ausgegeben werden
72
 
73
Schiebe_1:
74
     ;
75
     ; jeweils das höchstwertige Bit aus temp1 ins Carry-Flag schieben
76
     ; Je nach Zustand des Carry-Flags wird die Datenleitung entsprechend
77
     ; gesetzt oder gelöscht
78
     ;
79
    rol  temp1                 ; MSB -> Carry
80
    brcs Schiebe_One           ; Carry gesetzt? -> weiter bei Schiebe_One
81
    cbi  SCHIEBE_PORT, SIN     ; Eine 0 ausgeben
82
    rjmp Schiebe_Clock         ; und Sprung zur Clock Puls Generierung
83
Schiebe_One:
84
    sbi  SCHIEBE_PORT, SIN     ; Eine 1 ausgeben
85
 
86
     ;
87
     ; einen Impuls an SCK zur Übernahme des Bits nachschieben
88
     ;
89
Schiebe_Clock:
90
    sbi   SCHIEBE_PORT, SCK    ; Clock-Ausgang auf 1 ...
91
    cbi   SCHIEBE_PORT, SCK    ; und wieder zurück auf 0
92
 
93
    dec   temp2                ; Anzahl der ausgegebenen Bits runterzählen
94
    brne  Schiebe_1            ; Wenn noch keine 8 Bits ausgegeben -> Schleife bilden
95
 
96
    pop   temp2
97
    ret


Jemand ne Ahnung dazu?

von Michael U. (amiga)


Lesenswert?

Hallo,

womit programmierst Du den µC?
was passiert dabei?
Schaltplan?

Am ASM-Programm liegt es sicher nicht.

Gruß aus Berlin
Michael

von Otto (Gast)


Lesenswert?

Wahrscheinlich hast Du die Fuses geändert.....

Otto

von Willi W. (qwertzinger)


Lesenswert?

@Otto

Da ich Anfänger bin, weiß ich leider nicht was Fuses genau sind. 
Allerdings hab ich in der vorhanden Software (Franzis Lernpaket) ein 
Button namens "Bootloader and Fuses", den man vor dem ersten Gebrauch 
des MCs drücken soll (hierbei soll Reset und Ground miteinander 
verbunden sein).

Ich hab den Button gedrückt und ich kann wieder uploaden.

Weiß jemand ne Erklärung?

Wie hab ich mit dem Programmcode die sog. Fuses manipuliert?

von Otto (Gast)


Lesenswert?

Hallo Willi,

nein - mit Deinem Programm eher nicht - es wird an der SW des "Franzis 
Lernpaket" liegen.

Evtl. suchst Du in der Beschreibung mal nach "Fuses".

Ansonsten empfehle ich Dir das Tutorium.

Gruss Otto

von FRAGENSTELLER (Gast)


Lesenswert?

@ Willi Wuff

möglicherweise hat dein programm den bootloader überschrieben.

von Peter D. (peda)


Lesenswert?

Warscheinlich arbeitet das Lernpaket mit nem Bootloader.
Ist keine Applikation geladen, wird der Bootloader immer von neume 
ausgeführt.
Mit Applikation wird der Bootloader nur kurz nach dem Reset ausgeführt 
und dann die Applikation.
Dann muß zum neu laden immer Reset gedrückt werden.


Peter

von Willi W. (qwertzinger)


Lesenswert?

also ich hab den programmcode (das einzulesene byte) kurz geändert, 
wollte es neu laden wieder gleiches problem.
wieder "bootloader and fuses" gedrückt, trotzdem fehler. Programm 
geschlossen, wieder geöffnet, nochmal button gedrückt. Schon gehts 
wieder.

Als absoluter MC-Laie ist das ganz schön schwierig das nun zu verstehen. 
Vor allem da Bootloader und Fuses eben leider noch Fremdbegriffe für 
mich sind. Hoffe das ändert sich schnell.

von FRAGENSTELLER (Gast)


Lesenswert?

hast du das anleitungsheft schon von a bis z durchgearbeitet?
wenn nicht, mach' es.

von Timmo H. (masterfx)


Lesenswert?

Wenn du ein µC mit Bootloader hast ist der wohl zerschossen. Wenn du ihn 
direkt per ISP programmierst, hast du vielleicht vergessen den 
Flashspeicher vorher zu löschen

von Sinusgeek (Gast)


Lesenswert?

Die PC-Software hat ein Timing-Problem. Deshalb gibt es ein Update:
http://www.b-kainka.de/LPmicrosUpdate.zip
Beschrieben ist das z.B. hier:
http://www.b-kainka.de/lpmikros.htm

Nein, ich kenne, besitze und benutze das Franzis-Zeug nicht, habe nur 
mal aus Neugierde diesen Beitrag gelesen und die Kugel befragt.

von pastscho (Gast)


Lesenswert?

Der bescheidene Tiny13
ich hasse den Total hab mal 20 von dennen so wie du geschrottet(zumglück 
auf Geschäfts kosten).

Also hab damals auch geguckt was und warum der dadurch nimmer geht und 
bin nach langer suche auch fündig geworden:

Du must den Watchdog explizit ausschalten (warum auch immer)
dann müste es funktionieren

Hab damals die dinger Programmiert und danach ging auch nixmehr nur wenn 
ich es mit nem HVProgrer gemacht habe konnte ich die dinger wider 
ansprechen.

Mein Code war auch einwandfrei er lief ja danach als Probe auch auf nem 
Mega8

also probiers einfachmal mit watchdog ausschalten ganz am anfang von 
deinem programm dann müste es gehen!

mfg
pastscho

von Sinusgeek (Gast)


Lesenswert?

Also Watchdog-Probleme hatte ich beim Tiny13 noch nie. Und ich habe 
einige Tiny13 mit unterschiedlichen Eigenbau-Programmen (ASM) im 
Einsatz.

von pastscho (Gast)


Lesenswert?

Die Probleme mit dem Tiny13 und dem Watchdog treten auch meistens nur 
auf wenn man mit viel warteschleifen arbeitet da kann des so pasieren 
das die sich selbst zu tot aufhängen!

von Sinusgeek (Gast)


Lesenswert?

> wenn man mit viel warteschleifen arbeitet

Nagut, wer Sowas macht, der frisst auch kleine Kinder und steckt Häuser 
an... ;-)

Spaß beiseite, der Tiny13 hat zwar nur einen Timer, der hat aber zwei 
Compare-Units, da erübrigen sich Warteschleifen. Es ist immer besser, 
andere Arbeit zu erledigen oder bis zum nächsten Interrupt zu pennen, 
anstatt in einer Warteschleife Takte zu zählen.

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.