Guten Tag an alle Ich gerade dabei mir die assemblersprache bei zu bringen und als anfänger möchte ich dieser kleine Programme zum laufen zu bringen. Leider habe ich irgendwo ein Fehler gemacht, es möchte nicht laufen. Kann mir jemand erclären wie das gehen soll. Danke das ist wie im Titel gesagt, ein Atiny 2313. Dieser Programme soll ein LED alle 0,5secunde blicken lassen. Hier ist der Code /************************************************* * Initialiesierung Zuweisung *************************************************/ .include "tn2313def.inc" .def Direction = r16 .def temp = r17 .def loopcount = r18 ; ============================================== ; Interupts ; ============================================== ; .CSEG .ORG $0000 rjmp Main .ORG OVF0addr rjmp TIMER0_COMPA_vect /********************************************************** * Loopcount 125 Timer Interrupt Initialiesierung ***********************************************************/ Main: ldi temp,low(RAMEND) out SPL,temp ldi Direction, 0b00100000 out DDRD, Direction ldi loopcount, 0 ldi temp, 125 out OCR0A, temp ldi temp, ( 1 << WGM02 ) | ( 1 << CS02 ) out TCCR0B, temp ldi temp, (1 << OCIE0A) out TIMSK, temp sei loop: rjmp loop TIMER0_COMPA_vect: inc loopcount cpi loopcount, 125 brne Ende ldi loopcount, 0 in temp, PORTD eor temp, Direction out PORTD, temp Ende: reti
Claude B. schrieb: > .ORG OVF0addr > rjmp TIMER0_COMPA_vect 'OVF0addr' klingt so nach Timer0-Overflow. Dafür gibt's aber keine Freigabe. Du hast den 'Timer/Counter0 Compare Match A' freigegeben und der möchte an $000D eingetragen werden.
guten abend Ralf, und Danke für dein Antworte, der "OVF0addr" ist der Overflow interrupt du hast geschrieben "Du hast den 'Timer/Counter0 Compare Match A' freigegeben und der möchte an $000D eingetragen werden." ich bin da überfordet Vielleicht kannst du mir erklären wie ich mein Fehler aufheben kann? wie gesagt, ich bin un klein Anfänger, ich möchte lernen. Danke
erstmal Tutorial lesen dann versuchen das Datenblatt zu lesen/verstehen dann kommt man vielleicht selbst auf die Fehler die man gemacht hat 1. die Interupt Vectoren
1 | ; ============================================== |
2 | ; Interupts |
3 | ; ============================================== |
4 | ; |
5 | |
6 | .org 0x000 |
7 | rjmp main ; Reset Handler |
8 | .org OC0Aaddr |
9 | rjmp TIMER0_COMPA_vect |
10 | |
11 | |
12 | |
13 | /********************************************************** |
14 | * Loopcount 125 Timer Interrupt Initialiesierung |
org 0 rjmp main hat gefehlt und timer0 falsch 2. die entsprechenden bit positionen befinden sich in zwei Register
1 | ldi temp, ( 1 << WGM01 ) |
2 | out TCCR0A, temp |
3 | ldi temp, ( 1 << CS02 ) |
4 | out TCCR0B, temp |
mfg
einschuldigung, ich verstehe nicht ganz ich habe : ldi temp,125-1 out OCCR0A, temp geladen mit 125-1 dann nach dein Aussage, kommt ldi temp(1<<WG01) out TCCROA,temp ich überschreib doch TCCR0A oder habe ich falsch verstanden, weil dann ldi temp, ( 1 << C02) out TCCR0B, temp ....
das ist falsch ! ldi temp, ( 1 << WGM02 ) | ( 1 << CS02 ) out TCCR0B, temp da sich WGM02 und CS02 in unterschiedlichen Registern befinden einmal in TCCR0A und einmal in TCCR0B folglich ist es so richtig = ldi temp, ( 1 << WGM01 ) out TCCR0A, temp ldi temp, ( 1 << CS02 ) out TCCR0B, temp schau in dein Datenblatt vom 2313
Vielen dank für Dein Antworte,die ist mir sehr hilfsreich mit der Datenblatte, habe ich einige Problème zu verstehen. Ich probiere das ganz wieder von vorn und ich melde mich, Vielendanke nochmal
was vergessen WGM02 alleine zu setzen ist falsch Table 40. Waveform Generation Mode Bit Description Mode WGM2 WGM1 WGM0 4 1 0 0 Reserve
Das sollte funktionieren :
1 | /************************************************* |
2 | * Initialiesierung Zuweisung |
3 | *************************************************/ |
4 | .include "tn2313def.inc" |
5 | |
6 | .def Direction = r16 |
7 | .def temp = r17 |
8 | .def loopcount = r18 |
9 | |
10 | ; ============================================== |
11 | ; Interupts |
12 | ; ============================================== |
13 | ; |
14 | |
15 | .org 0x000 |
16 | rjmp main ; Reset Handler |
17 | .org OC0Aaddr |
18 | rjmp TIMER0_COMPA_vect |
19 | |
20 | |
21 | |
22 | /********************************************************** |
23 | * Loopcount 125 Timer Interrupt Initialiesierung |
24 | ***********************************************************/ |
25 | |
26 | Main: |
27 | ldi temp,low(RAMEND) |
28 | out SPL,temp |
29 | |
30 | ldi Direction, 0b00100000 |
31 | out DDRD, Direction |
32 | |
33 | ldi loopcount, 0 |
34 | |
35 | ldi temp, 125 |
36 | out OCR0A, temp |
37 | |
38 | ldi temp, ( 1 << WGM01 ) |
39 | out TCCR0A, temp |
40 | ldi temp, ( 1 << CS02 ) |
41 | out TCCR0B, temp |
42 | |
43 | |
44 | ldi temp, (1 << OCIE0A) |
45 | out TIMSK, temp |
46 | |
47 | sei |
48 | loop: |
49 | rjmp loop |
50 | |
51 | TIMER0_COMPA_vect: |
52 | |
53 | inc loopcount |
54 | cpi loopcount, 125 |
55 | brne Ende |
56 | ldi loopcount, 0 |
57 | in temp, PORTD |
58 | eor temp, Direction |
59 | out PORTD, temp |
60 | |
61 | Ende: |
62 | reti |
Vielen Danke Pasteur Braun Ich habe gerade überprüft, ich habe das Gleich aber es will nicht blinken. ich erwartet ein blink zeit von 0,5 secunde. Ich habe dieser Programme übernommen von: http://www.henrykoch.de/pages/programmieren/Pollin_Evaluations_Board/Pollin_Board_mit_ATTiny2313_blinkende_LED_mit_Timer.php das ich weiter einwickel möchte
Das funktioniert im Simulator vom Atmelstudio 4.18 genauso wie im Studio 7 und auch in real auf einem Testboard . Mit 8 Mhz internem Takt sollte deine Blinkzeit ungefähr stimmen (Bei Auslieferung ist die CKDIV8 Fuse gesetzt der Takt beträgt 1 Mhz dann ist die Blinkzeit entsprechend grösser) Überprüfe deinen Aufbau Ist die LED am richtigen Pin angeschlossen Ist die LED vielleicht verkehrt rum angeschlossen usw usw mfg
Guten Tag Ich Arbeitet mit STK 500. und ATMELSTUDIO 6.2 ich habe gerade ein copie paste von dein code, es funktioniere, aber zu langsam. wie kann ich wissen die einstellung der Frequanz, wie kanne ich die ändern? Ich werde natürlich nochmal prüfen wo mein Fehler ligt vielen dank
Datenblatt Seite 24 - System Clock and Clock Options Default Clock Source The device is shipped with CKSEL = “0100”, SUT = “10”, and CKDIV8 programmed. The default clock source setting is the Internal RC Oscillator with longest start-up time and an initial system clock prescaling of 8, resulting in 1.0 MHz system clock. This default setting ensures that all users can make their desired clock source setting using an In-System or Parallel programmer. Dein 2313 läuft wahrscheinlich mit 1Mhz - programmiere die Fuse CKDIV8 um
Der fuse system ist auf 8MHZ 14ck 0ms das ist die einstellung der Studio, gibt es ein andere methode für das setzen der Fuse bit mit derm STK500?
Bonjour nochmal. Der Fuse bite ist richtig eingestellt, j'ai geändert die 125 in 62 une bekomme ich annähern 0.5 secunde. das ist mir sehr wichtig, ich möcht nämlich ein schaltuhr weiter bauen Vielendanke, Ich habe viele gelernt
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.