Om te beginnen, Rob, bedankt voor het opsturen van de programmer.

Gisteren avond heb ik hem aangesloten en kunnen lezen zonder probleem. Vanmiddag even wat ledjes aangesloten en dacht 'nu ga ik mijn programma er in programmeren' echter helaas.

Ik krijg het niet voor elkaar te programmeren. Ik blijf vastlopen op een error 21 als ik wil schrijven, kan zoveel lezen als ik wel.

Wie weet hoe ik verder moet gaan?

De LEDjes hangen waarschijnlijk aan dezelfde pinnen als de ISP. (PORTB, miso, mosi, sck)

Led hangt aan poort D... haal de led er af, dan nog doet write het niet.. hij 'wacht' 3 seconde, led isp gaat branden, en dan komt er een fout, -21

Hoe is dat te controleren? Ik heb deze via Atmel als smaple binnen gekregen.

Ik heb de oplossing (denk ik)

Ik heb wat verder rond gezocht en met moeite 3 forum pagina's van duits vertaald om er achter te komen dat die gast het zelfde probleem had, na mailen heb ik zijn oplossing gekregen :

Er zat een grote bug in PonyProg en is in 2.06c gefixed. Die heb ik gedownload en ik kan schrijven.

Next question... hoe krijg ik me programma nu gestart?

Als alles juist is geprogrammeerd zal het programma na het aansluiten van de voedingsspanning direct lopen, tenzij je een startknop voor het te lopen programma hebt geprogrammeerd, maar dan loopt wel al het deel "startknop uitlezen"

Rob

reset pin kun je als startknop gebruiken, reset aan massa is 'uit' reset zwevend of aan vcc (via weerstandje) dan is het 'aan'

Gewoon laten lopen als je de voedingsspanning aanlegt is het gebruikelijkste

Heren, bedankt, het werkt, me ledjes gaan nu heerlijk knipperen,zelfs een hele dag door :)

Ben nu bezig een input te maken, ik dacht...

5v -> weerstand -> schakelaar -> ingang en dan ingang inlezen (PORTA, pin 0) en als dat 1 is, is de schakkelaar aan, is dat 0 dan is de schakkelaar uit, echter lees ik altijd een 1

Interne pullup van de AVR inschakelen (zie datasheet). En dan schakel je tussen de pin en de gnd. Geen extra weerstand nodig.

Marcel

char const waardes[] = {0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x40, 0x40};
 
void wait( )
{  ;  }


void main()
{
  unsigned int i;
  unsigned char j;
  PORTD = 0xF0;
  DDRD  = 0xFF;
  
  PORTA = 0x00;
  DDRA  = 0x00;  
  while (1) 
  {
    for (j=0; j< 8; j++)  
    {
	  if (PORTA == 1)
            PORTD = waardes[j];
	  else
	    PORTD = 0xE0;
          for (i = 0; i < 10000; i++) wait ();
    }
  }
}

Dit is de code, volgens de datasheet is PORTA pin 1, pin 39. Deze geeft bij mij standaard 5 volt aan als deze aan staat, dus schakkel tussen daar en GND levert volgens mijn programma continu 1 op, want de laatste 3 ledjes branden bij mij altijd.

Over welke AVR gaat het trouwens? En welke C compiler?

PORTA is het uitgangsregister van poort A.
PINA is het ingangsregister van poort A.

Als je de pinnen van poort A als ingang wilt gebruiken met interne pullup aan doe je het volgende:


DDRA = 0; /* Alle pinnen van poort A als ingang */
PORTA = 255; /* Alle pullups op poort A inschakelen */

value = PINA; /* Inlezen waarde van poort A */

Zoals je ziet heeft PORTA een dubbele functie. Als de poort als uitgang is gedefineert in het Data Direction Register is dit gewoon de waarde die op de poort komt. Als de poort als ingang is gedefineert in het Data Direction Register dan schakel je hiermee de interne pullup weerstanden in.

Het kan overigens per pin, het hoeft niet voor de hele poort.

Dat alles staat in de datasheet.

Marcel

Oke, heb nu dus het inlezen niet meer met PORTB maar met PINB gemaakt, echter maakt niet uit wat ik probeer :S ik krijg geen reactie...

Als ik PINB.0 aan GND verbind gebeurt er niets, als ik PINB met niets verbind gebeurt er niets...

Kortom... hoe maak ik een schakelaar/drukknop :S want ik snap het niet meer.

Je probleem is nu erg onduidelijk. Wat heb je precies gedaan (code). En nogmaals welke AVR en welke C compiler?

Marcel

ATmega8515

ICC AVR C compiler

#include < io8515v.h >
#include < macros.h >

char const waardes[] = {0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x40, 0x40};
 
void wait( )
{  ;  }


void main()
{
  unsigned int i;
  unsigned char j;
  PORTD = 0xF0;
  DDRD  = 0xFF;
  PORTB = 0x00;
  DDRB  = 0x00;
  
  while (1) 
  {
    for (j=0; j< 8; j++)  
    {
      if (PINB == 1)
        PORTD =0xE0;
      else
        PORTD = waardes[j];
      for (i = 0; i < 10000; i++) wait ();
    }
  }
}

Laat ik de vraag veranderend, hoe sluit ik nu een schakelaar aan zodat ik PINB aan en uit kan zetten...

Ok even een klein voorbeeldje.


void main()
{
  DDRA = 0; /* alle bits van poort A als ingang
  PORTA = 255; /* poort A pull-up weerstanden aan */

  DDRB = 255; /* alle bits van poort B als uitgang */
  PORTB = 0; /* alle bits uit */

  while(1) /* oneindige loop */
  {
    PORTB = PINA;
  }
}

Wat doet bovenstaande code:

PORTB neemt de status van PORTA exact over.
Als je op nu pin 0 van poort A laag maakt, moet pin 0 van poort B ook laag worden.

Als je dit werkende krijgt, dan kan je een stap verder gaan.

Marcel

Ik snap de kant van het programmeren, ik heb de laatste 2 jaar diverse applicaties voor siemens microcontrollers geschreven (moet alleen even wat meer op de verschillen gaan letten met de AVR) mijn grootste vraag is, hoe maak ik in de schakeling dan die schakelaar?

Op 19 januari 2004 19:21:10 schreef Parcye:
Ik snap de kant van het programmeren, ik heb de laatste 2 jaar diverse applicaties voor siemens microcontrollers geschreven (moet alleen even wat meer op de verschillen gaan letten met de AVR) mijn grootste vraag is, hoe maak ik in de schakeling dan die schakelaar?

Zoals ik al eerder zie. Interne pull-up van de AVR inschakelen (zie datasheet). En dan schakel je tussen de pin en de gnd.

Als je dat nou eens test met bovenstaande code (daarin worden de interne pull-up weerstanden ook ingeschakeld).

Marcel

Ik heb het geprobeerd maar maakt dus niet uit of ik het nu wel of niet aan de ground aansluit maaakt het niets uit.

Heb het nu deels werkend, nu moet ik nog zien te zorgen dat ik direct 1 pin kan uitlezen.

PINA&1 || PINA&2 || PINA&4 || PINA&8 || PINA&16 || PINA&32 || PINA&64 || PINA&128 !?

En dan niet vergeten de haakjes er om :) dat was mijn hele fout, pff is even wennen, al denk je ik ken het nog valt het toch snel weer even tegen