logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Łączenie asemblera i C w AVR

Tarkowski01 29 Mar 2010 23:30 870 0
REKLAMA
  • #1 7897315
    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
    
    #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
    
    #ifndef _ADC_H
    #define _ADC_H
    
    
    #ifndef ADC_ASM
    
    uint16_t adc_read(void);
    
    #endif
    
    #endif 
    


    main.c
    
    #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.
  • REKLAMA
REKLAMA