w12101
Ouder en wijzer
hoe kan ik in deze code nog een output instellen
zodat de leds omstebeurt kunnen knipperen
#include <avr/io.h>
#include <util/delay.h>
// knipperende LED op PORTA.0 (PA0)
int main()
{
// PA0 als output
DDRA = (1 << PA0);
// oneindige lus
while(1)
{
// 0.5 sec delay
_delay_ms(500);
// PA0 hoog niveau
PORTA |= (1 << PA0);
// 0.5 sec delay
_delay_ms(500);
// PA0 laag niveau
PORTA &= ~(1 << PA0);
}
return 0;
}
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
#include <avr/io.h>
#include <util/delay.h>
// knipperende LED op PORTA.0 (PA0)
int main()
{
// PA0 als output
DDRA = (1 << PA0)|(1 << PA1);
// oneindige lus
while(1)
{
// 0.5 sec delay
_delay_ms(500);
// PA0 hoog niveau, pa1 laag
PORTA |= (1 << PA0);
PORTA &= ~(1 << PA1);
// 0.5 sec delay
_delay_ms(500);
// PA0 laag niveau, PA1 hoog
PORTA &= ~(1 << PA0);
PORTA |= (1 << PA1);
}
return 0;
}
EricP
mét CE
Ik neem aan dat je 'om de beurt' bedoelt.
Pak een 555. Die out kan zowel sourcen als sinken. Duty cycle op 50%. Klaar.
w12101
Ouder en wijzer

kan ik deze drie uitgangen apart aan sturen
met deze^^ code
#include <avr/io.h>
#include <util/delay.h>
// knipperende LED op PORTA.0 (PA0)
int main()
{
// PA0 als output
DDRA = (1 << PA0)|(1 << PA1)|(1 << PD2)|(1 << PD3);
// oneindige lus
while(1)
{
// 0.5 sec delay
_delay_ms(500);
// PA0 hoog niveau, pa1 laag
PORTA |= (1 << PA0);
PORTA &= ~(1 << PA1);
PORTA &= ~(1 << PD2);
PORTA &= ~(1 << PD3);
_delay_ms(500);
PORTA &= ~(1 << PA0);
PORTA |= (1 << PA1);
PORTA &= ~(1 << PD2);
PORTA &= ~(1 << PD3);
_delay_ms(500);
PORTA &= ~ (1 << PA0);
PORTA &= ~ (1 << PA1);
PORTA |= (1 << PD2);
PORTA &= ~(1 << PD3);
}
return 0;
}
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Dat gaat zo niet werken. Als je PDx wil sturen, moet je DDRD en PORTD gebruiken. Of DDRB en PORTB als je PBx wil sturen.
w12101
Ouder en wijzer
super bedankt ik ga het meteen proberen
Op 16 augustus 2011 19:25:06 schreef pros:
Dat gaat zo niet werken. Als je PDx wil sturen, moet je DDRD en PORTD gebruiken. Of DDRB en PORTB als je PBx wil sturen.
ZOU DIT MOETEN WERKEN DAN
#include <avr/io.h>
#include <util/delay.h>
// knipperende LED op PORTA.0 (PA0)
int main()
{
// PA0 als output
DDRA = (1 << PA0)|(1 << PA1);
DDRB = (1 << PD2)|(1 << PD3);
// oneindige lus
while(1)
{
_delay_ms(500);
PORTA |= (1 << PA0);
PORTA &= ~(1 << PA1);
PORTB &= ~(1 << PD2);
PORTB &= ~(1 << PD3);
_delay_ms(500);
PORTA &= ~(1 << PA0);
PORTA |= (1 << PA1);
PORTB &= ~(1 << PD2);
PORTB &= ~(1 << PD3);
_delay_ms(500);
PORTA &= ~ (1 << PA0);
PORTA &= ~ (1 << PA1);
PORTB |= (1 << PD2);
PORTB &= ~ (1 << PD3);
}
return 0;
}
[Bericht gewijzigd door Henry S. op (2%)]
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Nein, nein! Zo:
DDRA = (1 << PA0)|(1 << PA1);
DDRB = (1 << PB0)|(1 << PB1);
DDRD = (1 << PD2)|(1 << PD3);
PORTA |= (1 << PA0);
PORTB |= (1 << PB0);
PORTD |= (1 << PD0);
// enz...
Als je dit schrijft:
DDRB = (1 << PD2)|(1 << PD3);
vertaalt de compiler dat als
DDRB = (1 << PB2)|(1 << PB3);
en dat zonder de minste waarschuwing. Jij zit dan te meten aan PD2 en PD3, terwijl de AVR PB2 en PB3 stuurt.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Als je dit schrijft:
DDRB = (1 << PD2)|(1 << PD3);vertaalt de compiler dat als
DDRB = (1 << PB2)|(1 << PB3);en dat zonder de minste waarschuwing. Jij zit dan te meten aan PD2 en PD3, terwijl de AVR PB2 en PB3 stuurt.
dat meen je niet ?
een compiler die de code zomaar aanpast ? gooi dan een warning of een error als je per se wilt vallen over het assignen van PB aan PD. Zoiets is ontoelaatbaar in mijn boekske.
trouwens die PD2 en PD3 zijn waarschijnlijk gedefineerd als 2 en 3 zodat daar eigenlijk staat
DDRB = (1 << 2)|(1 << 3);
en dat eigenlijk
00000100 OR 00001000 is.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Ja, zeg! avr-gcc gaat niet echt de broncode aanpassen naar eigen smaak en wens. PA2, PB2 en PD2 zijn allen gedefinieerd als '2', en de compiler neemt niet de moeite na te gaan of PORTA wel een PB2-bit kent.
Een mens moet tenslotte over de mogelijkheid beschikken om in z'n eigen voet te schieten, als hij dat wil... 
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Methode om het probleem te omzeilen: Wees lui. Zet gewoon 2 neer ipv. PB2
. Aan het DDRx kun je toch al aflezen welke poort het is.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik begin ondertussen lol te krijgen in definities waarbij pB3 dus de OR is tussen PORT_B en PB3. PORTB is iets van (2<<3).
Ik heb dan een set_bit functie met
v = _BV (bit & BIT_MASK);
switch (bit & PORT_MASK) {
case PORT_B: PORTB |= v; break;
case PORT_C: PORTC |= v; break;
...
Dan kan je dus set_bit (pB3) doen. Verder geen omkijken meer naar.
En set_bit (pB2); vertaalt gewoon naar: sbi 37-32,3 . De optimizer haalt ALLE switch en zo dingen weg, en er bijlft precies hetzelfde over als van PORTB |= _BV (PB2);
Het jammere is alleen dat ik "PB2" als define voor PortB en Bit 2. had willen gebruiken, maar die is al bezet... 
w12101
Ouder en wijzer
ik heb een nicht rider balkje gemaakt
#include <avr/io.h>
#include <util/delay.h>
// knipperende LED op PORTA.0 (PA0)
int main()
{
// PA0 als output
DDRA = (1 << PA0)|(1 << PA1);
DDRB = (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|(1 << PB4)|(1 << PB5);
DDRD = (1 << PD2)|(1 << PD3);
while(1)
{
//LED 1
PORTB |= (1 << PB0);
_delay_ms(80);
PORTB &= ~(1 << PB0);
//LED 2
PORTB |= (1 << PB1);
_delay_ms(80);
PORTB &= ~(1 << PB1);
//LED 3
PORTB |= (1 << PB2);
_delay_ms(80);
PORTB &= ~(1 << PB2);
//LED 4
PORTB |= (1 << PB3);
_delay_ms(80);
PORTB &= ~(1 << PB3);
//LED 5
PORTB |= (1 << PB4);
_delay_ms(80);
PORTB &= ~(1 << PB4);
//LED 6
PORTB |= (1 << PB5);
_delay_ms(80);
PORTB &= ~(1 << PB5);
//LED 5
PORTB |= (1 << PB4);
_delay_ms(80);
PORTB &= ~(1 << PB4);
//LED 4
PORTB |= (1 << PB3);
_delay_ms(80);
PORTB &= ~(1 << PB3);
//LED 3
PORTB |= (1 << PB2);
_delay_ms(80);
PORTB &= ~(1 << PB2);
// LED 2
PORTB |= (1 << PB1);
_delay_ms(80);
PORTB &= ~(1 << PB1);
// LED 1
}
return 0;
}dat is met roze leds
Ik zoek nog steeds een manier dat je in de avr_gcc compiler gewoon kan zetten.
PORTG_Bit2 = 1;
onze IAr compiler kan dat namelijk wel, nadat we de pin defines aangepast hebben van 0,1,2,3,4,5,6,7 naar 0x00,0x01,0x02,0x04 etc.
Maarja zo'n ramp is het nou ook weer niet na wat deftige defines