neoel
Rather a (_E=MC2_) than a (_?_).
Hey,
Ik ben bezig met de code van mijn guitarhero project. => http://www.circuitsonline.net/forum/view/85151
Nu heb ik een erg vaag probleem om de "zelfgemaakte" chip aan te sturen, in de code voor de ATMEGA88 kan ik geen halftonen aansturen.
Het verschil van halftonen en gewone tonen ligt in de 0e bit van de A_TOT_G vector.
In de functie send_note zet ik PORTB op 0, de A_TOT_G vector zit aangesloten op b0 - b3.
Als ik in de code PORTB meteen op 0x01 zet, stuurt de chip alleen maar halftonen uit. Dat werkt.
Maar wanneer ik later (in code) PORTB op 0x1 zet, stuurt de atmel maar 1 toon door, en stopt dan gewoon.
Ik heb echt geen idee meer waar ik kan zoeken. Maar dit is zo raar.
In iedergeval alvast bedankt voor jullie hulp.
Hier is mijn code te vinden. => http://fruitvlieg.net/media/elektro/guitarhero.c
De send_note functie staat bijna onderaan.
Grtz
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
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
neen. de oplossing is om een intenre variabele te gebruiken die de gewenste toestand vand e poten bijhoudt.
je code modificeert die variable.
slechts op 1 plaats wordt de variabele gekopieerd naar de fysieke poten.
ik weet niet hoe de processor i/o opgebouwd is maar bij sommige processoren is het lezen van de i/o eigenlijk het lezen van de i/o return. bij andere is het net de fysieke poten mar gewoon het output register.
wanneer jij schrijft dan ga je gegarandeerd in het output register. wanneer ene je een bit flipt dan gebeurt er eerst een read vand e huidig toestand en dan wordt daar op gewerkt. de vraag is wat wordt er gelezen ? de fysieke poten of het register ? dat hangt van de i/o implementatie af.
eenvoudigste manier is om met een interne variabele te werken. je modificaties gebeuren daarop en die zijn uniform ( niet afhankelijk van fysieke i/o implementatie )
op 1 plaats wordt er dan alleen geschreven naar de output.
neoel
Rather a (_E=MC2_) than a (_?_).
Oke, bedankt voor je hulp FE.
Die PORTB rewrite werkt nu wel.
Maar het werkt nog steeds niet, Als ik in mn testlied een halftoon meestuur, (het is een toonladder van C, maar dan met een fis ipv een f)
hoor ik "C, D, E", zie ik "Groen, Rood, Geel, Blauw, Groen".
Dus de videodata van Fis en G wordt nog wel doorgestuurd.
Maar er wordt geen audiodata ingelezen van Fis en G.
Het zou ook nog aan de guitarhero chip kunnen liggen, maar als alle tonen halftonen zijn, heeft de guitarhero chip geen probleem met halftonen.
Ik heb echt geen idee waar het aan kan liggen.
Toen we de chip testten, waarbij een fpga de liedjes doorstuurde, werkte het wel gewoon.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
avr-gcc vertaalt opdrachten als
PORTB = 0x01;
PORTB |= 0x80;
PORTB &= ~(1 << PB0);
netjes naar assembly, zoals je zou verwachten. Daar verwacht ik geen problemen.
Wat neoel wel moet doen, is alle variabelen die behandeld worden in de ISR's als "volatile" declareren. Zo vermijd je, dat de compiler stikuum wat weg-optimaliseert.
Ik zag ook nog dit:
void init() {
// define port directions
DDRB = 0xFF;
DDRC = 0x00;
DDRD = 0xFC;
// define input pullups
PORTC = 0;
Als je de interne pullups van PORTC wil activeren, moet je PORTC hoog maken terwijl DDRC laag is. Dat laatste hoef je niet expliciet in je code te plaatsen - DDRC is na een RESET sowieso 0.
neoel
Rather a (_E=MC2_) than a (_?_).
Op 24 juni 2010 19:44:27 schreef pros:
Wat neoel wel moet doen, is alle variabelen die behandeld worden in de ISR's als "volatile" declareren. Zo vermijd je, dat de compiler stikuum wat weg-optimaliseert.Als je de interne pullups van PORTC wil activeren, moet je PORTC hoog maken terwijl DDRC laag is. Dat laatste hoef je niet expliciet in je code te plaatsen - DDRC is na een RESET sowieso 0.
Bedankt, voor je suggesties, het zit er nu in, maar het heeft het probleem niet verholpen.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Nou, ik vind het ook een "vaag" probleem, hoor. Zeker dit:
PORTB = 0x1; // als deze instructie in het programma zit, crashed de atmel
Bedoel je hier dat hij werkelijk dol draait (of juist niets meer doet) als je deze instructie toevoegt? Dat is absurd, wat software betreft. Een hardware-fout lijkt me waarschijnlijker.
Als ik in de code PORTB meteen op 0x01 zet, stuurt de chip alleen maar halftonen uit. Dat werkt.
Maar wanneer ik later (in code) PORTB op 0x1 zet, stuurt de atmel maar 1 toon door, en stopt dan gewoon.
Je code is rechttoe-rechtaan, zonder rare kronkels. Ik zie niet in, hoe zo'n simpele instructie de boel in 't honderd kan laten lopen.
Sorry, ik had niet alles gelezen, dat "volatile" probleem was al besproken..
Boodschap is dus gewist.
[Bericht gewijzigd door poederdoos op (90%)]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op 24 juni 2010 18:44:11 schreef free_electron:
lijkt me een read-modify write probleem ...
Jij hebt zeker PICs geprogrammeerd? Een AVR heeft een PIN register om de poort status terug te lezen. Het PORT register is altijd wat je er ingezet hebt.
TS: Sorry, ik zie je probleem ook niet. 