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;
}


#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;
}

Ik neem aan dat je 'om de beurt' bedoelt.
Pak een 555. Die out kan zowel sourcen als sinken. Duty cycle op 50%. Klaar.

http://www.uploadarchief.net/files/download/attiny2313attiny.jpg
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;
}

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.

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%)]

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.

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.

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... :-)

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.

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... :-(

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