Ahoj, dal jsem se do ovládání dvoumístné LED sedmisegmentovky pomocí Atmegy a posuvného registru 74164. Vše se mi podařilo až na jednu věc. Do registru posílám z Atmegy tři signály: hodiny, data a multiplex dvou číslic. Chtěl bych vytvořit univerzální funkci, kde nebudu muset uvnitř ní zadávat ručně port a pin, kde tyto tři signály jsou, ale rád bych je zadával do funkce v jejím volání jako proměnné.
Narazil jsem na článek, který toto popisuje:
ccrma.stanford.edu/courses/250a … _port_pass
odstavec How do I pass an IO port as a parameter to a function?
Můj kód, kde byly porty a piny natvrdo napsané funguje bezvadně a sedmisegmentovka zobrazuje zadané číslice, ale jakmile změním volání portů podle článku, AVR Studio vrací při kompilaci třikrát tuto chybu:
warning: passing argument … of ‘my_program’ makes pointer from integer without a cast
Googlil jsem, ale nejsem z toho moudrý a nevím, jak kód opravit.
Díky předem za rady.
Pavel
Můj zkrácený kód je zde:
[code]#include <avr\io.h>
#include <inttypes.h>
#define SEG_0 0x03
#define SEG_1 0x9F
// ... a další číslice
uint8_t pole] = { SEG_0, SEG_1, ... a další číslice };
uint8_t i = 0;
uint8_t SEG_BUF = 0x00;
void funkce ( uint8_t cislice1,
uint8_t cislice2,
volatile uint8_t *port_clk, uint8_t pin_clk,
volatile uint8_t *port_data, uint8_t pin_data,
volatile uint8_t *port_mpx, uint8_t pin_mpx
)
{
SEG_BUF = pole[cislice1]; //naplním buffer zobrazením první číslice
*port_mpx |= (1 << pin_mpx); //přepnutí na jeden segment pomocí HIGH
for(i=0; i<8; i++) //smyčka bufferu pro 8 hodnot = 1 byte
{
*port_data = (*port_data & ~(1<<pin_data)) | ((SEG_BUF & 0b00000001) << pin_data);
SEG_BUF = (SEG_BUF >> 1); //rotuji SEG_BUF o jednu pozici na další zapisovanou hodnotu na jeho pozici 0
*port_clk &= ~(1 << pin_clk); //hodiny na LOW
*port_clk |= (1 << pin_clk); //hodiny na HIGH - náběžnou hranou se bit zapíše do posuvného registru
}
// ... a podobně pro druhou číslici
}
int main(void)
{
DDRB = 0b11111111;
PORTB = 0b11111111;
DDRC = 0b11111111;
PORTC = 0b11111111;
DDRD = 0b11111111;
PORTD = 0b11111111;
while (1)
{
funkce (2,7,PORTB,0,PORTD,0,PORTC,5);
// na čítač posílám reprezentaci číslic 2 a 7
// hodiny pro čítač budou na portu B pinu 0
// data do čítače budou na portu D pinu 0
// multiplex dvou číslic bude na portu C pinu 5
}
}[/code]