[asm] atmega32 uart receive vanaf pc lukt niet

Pagina: 1
Acties:

  • nzyme
  • Registratie: November 2001
  • Laatst online: 28-11 23:41
goed, ik denk ik waag het hier eens:

(atmega32 chip op een stk500 plankje)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
.include "m32def.inc"
.def State              = R16             ; Definieer de variabele State.
.def NewInput           = R17             ; Definieer de variabele NewInput
.def Test               = R21
.def Delay              = r22
.def Delay2             = r23
.def Delay3             = r24
.def counter            = r18


.org 0x0000                             ; Reset interrupt
.equ    clock           = 8000000
.equ    baudrate        = 4800
.equ    baudkonstant    = (clock/(16*baudrate))-1
rjmp usart_init

.org 0x01A                              ; USART RX Complete interrupt
ontvanger:
; Wait for data to be received

                sbis    UCSRA, RXC
        rjmp    ontvanger
; Get and return received data from buffer
        ;ldi      r19, UDR

        out     PORTB, r19              ; beuk r19 in UDR (ofwel knal dat over de seria
                out             UDR, r19

loop:
rjmp loop

/*      ********************************
        Initialisatie van het programma
        *********************************/
usart_init:
; Set baud rate r17:r16 = baudrate
        push    r16
        push    r17
        ldi     r17, HIGH(baudkonstant)
        ldi     r16, low(baudkonstant)
        out     UBRRH, r17
        out     UBRRL, r16
; Enable Receiver and Transmitter + Receiver interrupt
        ldi     r16, (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)
        out     UCSRB,r16
; Set frame format: 8data, 2stop bit
        ldi     r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
        out     UCSRC, r16
        pop     r17
        pop     r16
                sei

led_init:
        ser     R19
        out     DDRB, R19               ; Port B is een output port (via LEDs)
        clr     R19
        out     DDRA, R19               ; Port A is een input port (via switches)

/*      ********************************
        Hoofdprogramma
        *********************************/
lus:
        in      R19, PINA               ; Lees welke knoppen worden ingedrukt en kopieer dit in R16.
        out     PORTB, R19              ; Schrijf de inhoud van R19 naar de 
LEDs.
        cpi     R19, 0xFF               ; Is er niets ingedrukt is?
        breq    lus
        rjmp    usart_transmit

led_aan:
        out     PORTB, R19              ; Schrijf de inhoud van R19 naar de 
LEDs.
        inc     counter
        rjmp    usart_transmit

usart_transmit:
        sbis    UCSRA,UDRE              ; wacht tot er iets wordt ontvangen
        rjmp    USART_Transmit          ; blijf wachten
        out     UDR,r19                 ; beuk r19 in UDR (ofwel knal dat over de serial port)

DLY:
        ldi     r25, 0x00
        dec     Delay
        brne    DLY
        ldi     Delay,0xDD
        dec     Delay2
        brne    DLY
        ldi     Delay2,0xBC
        rjmp    lus


goed, het probleem is nu dat ik niets kan ontvangen op het plankje. Dwz, ik ontvang iets door bijv '10011001' te sturen via een terminal programma, en de lampjes gaan in een rare volgorde branden. Ongeacht wat ik stuur. Laat ik vervolgens de input van UDR ook weer terugsturen naar de pc dan komt er dus keurig binnen wat er ook naar de lampjes gaat: steed hetzelfde dus.

Ik heb google al afgezocht, maar kom er dus niet uit....

de bedoeling is dat het lampje aangaat als er iets gestuurd wordt vanaf de pc.

Wat doe ik nou fout ?

| Hardcore - Terror |


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:32

Creepy

Tactical Espionage Splatterer

Wilde gok: je stuurt steeds het (ascii) karakter 1 of 0 over de lijn, maar je leest vanaf je plank direct een byte uit welke je gebruikt om te bepalen welke leds aan of uit moeten (i.p.v. 1 byte per elke 0 of 1 die je verstuurt)

Zo niet, krijg je het met je eigen code welk voor elkaar om een lampjes in een van te voren bepaald patroon te laten branden? Kan je met een lijn tester / snooper / whatever controleren wat er nu 1 op 1 over de lijn wordt verstuurd en weet je 100% zeker dat de compoort instellingen van de PC gelijk zijn aan die van je plank?

[ Voor 43% gewijzigd door Creepy op 06-02-2007 15:01 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • teun-v
  • Registratie: Maart 2005
  • Niet online

teun-v

Koffie? ja graag...

Als ik het zo goed lees, blijft je programma na het recive interrupt hangen in "loop" zonder terug te keren naar de onderbroken plek in "lus". Volgens mij heb je trouwens ook geen stack aangemaakt waardoor het interupt verhaal en de twee push en pop's al helemaal niet goed kan werken.

Verder klopt het wat Creepy schrijft, je stuur ascii chars van 8 bit (1 byte) en daar 8 van, die zul je dus even moeten omrekenen. je voorbeeld (10011001 = Dec 203) een teken uit de extended ascii tabel, en is meest waarschijnlijk een T-stukje wat zich niet op je toetsenbord bevind :P

Edit: een interrupt moet je geloof ik afsluiten met RETI. Tevens zou ik je naar deze pagina willen verwijzen om daar onder het hoofdstuk SRAM even de paragraaf over de stack en interrupts te lezen

Edit2: eigenlijk klopt er best wel veel niet aan je programma, ik weet niet of al eerder avr's geprogrammeerd hebt, maar begin met iets simpels en werk dit uit naar waar je na toe wil

[ Voor 31% gewijzigd door teun-v op 06-02-2007 16:00 ]

Ook gek op Ovalracen? | Canon EOS 350 D | Canon EF-S 10-22mm F/3.5-4.5 | Sigma 17-70 F/2.8-4.5 DC Macro | Canon EF 70-200 F/2.8L USM | >Blog< |


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Kweenie of je perse ASM wilt maar er zijn gratis C compilers voor AVR chips, bijvoorbeeld winavr
( http://winavr.sourceforge.net/ )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • nzyme
  • Registratie: November 2001
  • Laatst online: 28-11 23:41
nee, dit moet in asm :( anders had ik allang c gepakt ;)

code is op dit moment idd een beetje halfgaar in een aantal opzichten, dat klopt helemaal.

lampjes laten branden is geen probleem trouwens, wanneer ik met bovenstaande code een knopje indruk gaat het corresponderende ledje branden en krijg ik diezelfde code ook in mn terminal programma. De interrupt werk toch echt wel, de corresponderende code wordt uitgevoerd bij het versturen van iets naar het plankje...

het afsluiten van de reti (return from interrupt immers) klopt natuurlijk ook.
Wilde gok: je stuurt steeds het (ascii) karakter 1 of 0 over de lijn, maar je leest vanaf je plank direct een byte uit welke je gebruikt om te bepalen welke leds aan of uit moeten (i.p.v. 1 byte per elke 0 of 1 die je verstuurt)
dat zou het heel goed kunnen zijn, maar waarom krijg ik dan steeds bij iedere poging dezelfde uitkomst? of zou dat gewoon een standaard uitkomst zijn voor een onbekende 'iets' ?

| Hardcore - Terror |


  • teun-v
  • Registratie: Maart 2005
  • Niet online

teun-v

Koffie? ja graag...

nzyme schreef op dinsdag 06 februari 2007 @ 20:48:
[knip]

het afsluiten van de reti (return from interrupt immers) klopt natuurlijk ook.

[knip]
kun je je asm code dan posten zoals hij nu is, wand je sluit je interrupt in je ts af met:
GAS:
1
2
loop:
rjmp loop

het is zo namelijk een beetje gissen naar wat er nu echt gebeurt :)

Ook gek op Ovalracen? | Canon EOS 350 D | Canon EF-S 10-22mm F/3.5-4.5 | Sigma 17-70 F/2.8-4.5 DC Macro | Canon EF 70-200 F/2.8L USM | >Blog< |


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Zo uit het hoofd moet je altijd data en status register uitlezen omdat anders je int vlag niet gecleared wordt. Daarnaast moet je ook je sync flag uitlezen en testen voordat je de data gebruikt.

Ik zie dat ff niet terug in jouw code Ik snap ook de loop in je interrupt handler niet eigenlijk, waarom staat ie daar?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1