Hallo Leute,
Ists möglich bei einem Funktionsaufrum den Ausgangsport Variabel zu
machen?
Variabler Pin ist mir klar.
zB:
void ausgang (??? Portx, uint_8 Pinx)
{
Portx |= (1<<Pinx);
}
ausgabe(???,meinpin);
und wie muss ich dann das deklarieren?
Danke schon im Voraus für eure Bemühungen :-)
Lg.
Harald
Wenns für den AVR ist:
http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass
Wobei man evtl darüber nachdenken sollte, den Pin als Maske zu
übergeben, also nicht:
function(&PORTA, 1);
sondern
function(&PORTA, 1<<1);
Das kann der Compiler nämlich besser optimieren (er übergibt einfach
direkt die Zahl) und muss nicht ewig rum shiften.
mfG
N.G.
N. G. schrieb:> Das kann der Compiler nämlich besser optimieren
Das hat sich in der Regel sowieso schon mit der Übergabe der Portadresse
erledigt. Über mehrere Dateien verliert auch da der LTO die Übersicht.
(-> Es könnte sich ja auch um einen Port handeln, der nicht mit IN/ OUT
erreichbar ist.)
Zur Frage:
Hi,
Danke für die schnelle Antwort:-)
Hat auch mehr oder weniger gut funktioniert....
noch eine andere frage, in einer forschleife kann ich da auch für "i"
uint32 verwenden?
ich brauch pausen von 250us bis 5min. Mein cood sieht so aus:
const uint32_t t_daten[] PROGMEM =
{1,4,10,16,20,40,80,160,400,4000,8000,16000,32000,60000,120000,180000,24
0000,360000,480000,720000,1200000};
uint32_t bel_time=400;
if (time<=21) bel_time = t_daten[time];
for (uint32_t i=0;i<bel_time;i++){
_delay_us(250);
}
aber irgendwie funktioniert das nicht.
Er kommt aus der schleife nicht mehr raus.
Harald U. schrieb:> noch eine andere frage, in einer forschleife kann ich da auch für "i"> uint32 verwenden?
Ja, aber statt
1
if(time<=21)
sollte da
1
if(time<21)
stehen, sonst wird für t = 21 ein Wert außerhalb des Arrays gelesen.
> Er kommt aus der schleife nicht mehr raus.
Nach spätestens 12,5 Tagen sollte es so weit sein. Hast du so lange
gewartet? ;-)
Edit: Falls eine 0 gelesen wird, wartest du tatsächlich ewig.
Hab in der Schleife ein uart_putc eingebaut, also rein kommt er.
void fokusausloesung ()
{
uint32_t bel_time=400;
int time = uart_getc(); //wenn ich hier 1 übergebe , kommt er dann
unten auch nicht mehr raus.
if (time<=21) bel_time = t_daten[time];
PORTD |= (1<<PD3);
PORTB |= (1<<PB0);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
PORTB |= (1<<PB5);
for (uint32_t i=0;i<bel_time;i++){
_delay_us(250);
uart_putc(i); //zum prüfen
}
PORTB &= ~(1<<PB5);
PORTB &= ~(1<<PB0);
uart_putc(250);
PORTD &= ~(1<<PD3);
return;
}
Harald U. schrieb:> bel_time = pgm_read_byte(&t_daten[time])> Danke es funktioniert :-)
... kann eigentlich nicht sein. :-/
Die Funktion liest nur ein Byte. Du willst ja aber vier davon.
Ralf G. schrieb:> Harald U. schrieb:>> bel_time = pgm_read_byte(&t_daten[time])>> Danke es funktioniert :-)> ... kann eigentlich nicht sein. :-/> Die Funktion liest nur ein Byte. Du willst ja aber vier davon.
LOL. Auch erst jetzt gesehen...
Dann eben: