Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Probleem met Atmega32L programmeren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo!!

Ik heb een probleem en ik hoop dat jullie mij daar mij kunnen helpen. Ik ben zoals jullie al aan de titel kunnen zien een atmega32L aan het programmeren. De bedoeling van de atmel is dat ie wat sensoren in gaat lezen die vervolgens de waardes naar de computer door sturen (in vorm van letters).
Maar wat het programma of de atmel niet doet is het reageren op de ingangssignalen :@ Hij regageerd soms wel als ik met mn vingers over de pennen ga...:s
Suggestie's??


Het C programma:
-----------------------------------------------------------
#include <mega32.h>
#include <stdio.h>
#include <delay.h>


void main(void)
{


while (1)
{
delay_ms(100);


// Hier worden de ingangen voor de sensors benoemd en de bij behorende letters


if(PINA == 0x01) //Geeft letter m
putchar(0x6D);

else if(PINA == 0x02) //Geeft letter n
putchar(0x6E);

else if(PINA == 0x04) //Geeft letter o
putchar(0x6F);

else if(PINA == 0x08) //Geeft letter p
putchar(0x70);


// Hier wordt de uitgang voor de klep gedefinieerd

if (UDR !=0)
{
PORTA |= 0x80;
delay_ms(2000);
PORTA &= 0x7F; //0x80^0xFF;
UDR==0;
}
}
}

-----------------------------------------------------------

De communicatie is goed! (naar de computer en naar de programmer).En dat laatste gedeelte van het programma werk wel (het inlezen van een willekeurige karakter).

Alvast bedankt voor jullie reacties!!
edit: heb de code wat overzichtelijker gemaakt

[ Voor 46% gewijzigd door Verwijderd op 23-12-2005 19:26 ]


  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 29-10 06:07

Sprite_tm

Semi-Chinees

Titlefixje; je was een 'b' vergeten :)
Verder: kan je je code misschien even tussen [nobb][code][/nobb]-tags zetten? Dit leest kut :) En kan je de code die je timers en external ints init misschien weghalen? Die zijn hier namelijk compleet niet ter zake doende en leiden alleen af.

En ik zie de fout al: ga in de datasheet eens heel snel het verschil tussen PORTA en PINA opzoeken? :)

[ Voor 17% gewijzigd door Sprite_tm op 23-12-2005 18:53 ]

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


Verwijderd

Topicstarter
Sprite_tm schreef op vrijdag 23 december 2005 @ 18:48:
Titlefixje; je was een 'b' vergeten :)
Verder: kan je je code misschien even tussen [nobb][code][/nobb]-tags zetten? Dit leest kut :) En kan je de code die je timers en external ints init misschien weghalen? Die zijn hier namelijk compleet niet ter zake doende en leiden alleen af.

En ik zie de fout al: ga in de datasheet eens heel snel het verschil tussen PORTA en PINA opzoeken? :)
Heb PIN in PORT veranderd om te kijken of dit verder nog invloed had maar gaf het zelfde resultaat.

  • sebastius
  • Registratie: September 2000
  • Laatst online: 18-11 21:59

sebastius

Laten we lekker link gaan doen

Ok en heb je de Data direction bits en de interne pull-ups goed gezet?

Verwijderd

Topicstarter
sebastius schreef op vrijdag 23 december 2005 @ 19:34:
Ok en heb je de Data direction bits en de interne pull-ups goed gezet?
Ja heb de bijna de hele A PORT als ingang ingesteld, alleen de laaste 0x80 (laatste pin a kant) als uitgang ingesteld. Tevens de hele a kant op 0x00 ingesteld dus logisch laag. Dus op deze pennen een logische 1 ( 5V) aanbieden... Toch?? B)

  • EntonoX
  • Registratie: November 2001
  • Laatst online: 22-11 12:18

EntonoX

Team leider

Misschien ook even de juiste crystal frequentie declareren? ik weet dat dit bij bascom wel vaak helpt.

-===< Triumph TR7, 1977, Finished >===-


Verwijderd

Topicstarter
EntonoX schreef op vrijdag 23 december 2005 @ 19:47:
Misschien ook even de juiste crystal frequentie declareren? ik weet dat dit bij bascom wel vaak helpt.
Ok, nee ik weet zeker dat dit goed staat ingesteld maar bedankt voor de tip! :7

  • Bertrik
  • Registratie: Mei 2000
  • Laatst online: 22-06-2023
Kun je niet beter
if ((PINA & 0x01) != 0)
gebruiken, i.p.v.
if (PINA == 0x01)

Op die manier kijk je maar naar 1 bit, i.p.v. allemaal tegelijk.

En hoe is PINA gedefinieerd? Als het goed is, is het een 'volatile'. Daarmee ziet de compiler dat het een variabele is die hij niet mag weg-optimaliseren.

Verwijderd

Topicstarter
Bertrik schreef op vrijdag 23 december 2005 @ 20:00:
Kun je niet beter
if ((PINA & 0x01) != 0)
gebruiken, i.p.v.
if (PINA == 0x01)

Op die manier kijk je maar naar 1 bit, i.p.v. allemaal tegelijk.

En hoe is PINA gedefinieerd? Als het goed is, is het een 'volatile'. Daarmee ziet de compiler dat het een variabele is die hij niet mag weg-optimaliseren.
PORTA is zo gedefinieerd:

PORTA=0x00;
DDRA=0x80;

De pinnen zij gedfinieerd in een van deze denk ik?:
#include <mega32.h>
#include <stdio.h>
---------------------------------------------------------------------------------

Bedenkt voor de tip heb het net geprobeert en hij doet al veel meer!! Het volgende probleem doet zich alleen voor: Hij geeft nu continu karakters door. Als ik met mn voltmeter ga meten tussen die pen (pen van de "m" zeg maar) en de massa gaat ie over op een ander karakter( de o in dit geval). Hou ik de voltmeter tussen de massa en de pan van de "m" en zet ik er vervolgens ook nog 5 volt op die zelfde ingang geeft ie m netjes door!! Ik moet dus die ingangen aan de ground koppelen met een vrij hoge weerstand.. Iemand iedee voor een waarde? 10k ofzo?

[ Voor 50% gewijzigd door Verwijderd op 23-12-2005 21:21 ]


Verwijderd

Topicstarter
Bertrik schreef op vrijdag 23 december 2005 @ 20:00:
Kun je niet beter
if ((PINA & 0x01) != 0)
gebruiken, i.p.v.
if (PINA == 0x01)

Op die manier kijk je maar naar 1 bit, i.p.v. allemaal tegelijk.

En hoe is PINA gedefinieerd? Als het goed is, is het een 'volatile'. Daarmee ziet de compiler dat het een variabele is die hij niet mag weg-optimaliseren.
Nog even een vraagje.. :*) Als ik de uitgang voor de tweede keer hoog heb gemaakt door een karakter te sturen blijft de uitgang schommelen tussen de 3 en 5 volt. Na een reset van de controller doet ie het wel weer maar heb het liever dat het automatisch gaat. Ik gebruik de volgende code daarvoor:

if (UDR !=0)
{
PORTA |= 0x80;
delay_ms(2000);
PORTA &= 0x7F; //0x80^0xFF; // Alles met een 1 vermedigvuldigen behalve het laatste bitje(ook een reset)
UDR==0;

Ik denk dat de UDR==0 geen zin heeft of niet werkt. Ik wil dus dat het data register(UDR) weer gewist wordt. Iemand nog goeie ideeen?

[ Voor 9% gewijzigd door Verwijderd op 23-12-2005 22:00 ]

Pagina: 1