Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Łączenie asemblera i C w AVR

Tarkowski01 30 Mar 2010 00:33 705 0
  • #1
    Tarkowski01
    Poziom 11  
    Witam,
    napisałem w assemblerze funkcję obsługi ADC i chciałbym ją wykorzystać w kodzie w C.
    Zamieszczę przykładowy kod pokazujący o co mi chodzi:
    adc.asm
    Code:

    #include <avr/io.h>
    #define ADC_ASM
    #include "adc.h"


             .text

          .global adc_read
    adc_read:

       in R25, ADCL//ADCL
       in R24, ADCH//ADCH/*//ldi

       ret







    adc.h
    Code:

    #ifndef _ADC_H
    #define _ADC_H


    #ifndef ADC_ASM

    uint16_t adc_read(void);

    #endif

    #endif


    main.c
    Code:

    #include <avr/io.h>
    #include <inttypes.h>

    #include "adc.h"


    int main(void)
    {
      uint16_t adc_data;
      adc_data=adc_read();
      put_int8(77,30,(unsigned char)(adc_data),0);//ta funkcja wypisuje liczbę 8-bitową
      put_int8(77,60,(unsigned char)(adc_data>>8),0);
      while (1)
      {
      asm("nop");
      }
      return(0);    
    }



    Chodzi o to, że funkcje put_int16 nie zwracają odpowiednio 0x11 i 0x22, lecz 0x00 i 0x00.



    Ponadto co mam dodać abym nie musiał wstukiwać:
    #define ADCSR 0x26
    #define MCUCR 0x35
    ??

    Dodano po 1 [godziny] 2 [minuty]:

    Problem rozwiązałem.
    Za krótko czekałem na wynik i w efekcie cały czas zczytywałem 0x0000.


    Powinno być nie ADCSR tylko ADCSRA.