Índice:

AVR Assembler Tutorial 11: 5 etapas
AVR Assembler Tutorial 11: 5 etapas

Vídeo: AVR Assembler Tutorial 11: 5 etapas

Vídeo: AVR Assembler Tutorial 11: 5 etapas
Vídeo: Introduction to AVR Studio 2024, Novembro
Anonim
AVR Assembler Tutorial 11
AVR Assembler Tutorial 11
AVR Assembler Tutorial 11
AVR Assembler Tutorial 11
AVR Assembler Tutorial 11
AVR Assembler Tutorial 11

Bem-vindo ao Tutorial 11!

Neste breve tutorial, vamos finalmente construir a primeira parte do nosso projeto final.

A primeira coisa que você deve fazer é ir para a última etapa deste tutorial e assistir ao vídeo. Então volte aqui. [fazendo uma pausa enquanto você faz isso …] Certo. Agora prossiga.

Se você ainda não adivinhou, estamos construindo um jogo de dados! Claro, só porque estou construindo um jogo de dados, certamente não significa que você precise fazê-lo. Espero que isso seja desnecessário. Em qualquer caso, é útil usar microcontroladores para controlar monitores segmentados, etc., e para se comunicar uns com os outros - isso é principalmente o que estamos fazendo aqui. Você pode escrever código para usá-los da maneira que quiser. Por enquanto, vou codificá-los para jogar dados, embora possa decidir mais tarde redefinir os monitores segmentados para fazer outra coisa.

A razão pela qual estou construindo isso é porque estou pensando que, eventualmente, vou querer uma mesa de dados Vegas em tamanho real na minha "caverna de homem" no porão da minha casa. No entanto, nenhum dos meus amigos tem a menor ideia de como negociar, marcar ou pagar apostas e lançamentos de dados. Então achei que seria legal ter a mesa fazendo todo o trabalho do dealer para nós! Quando colocamos uma aposta na mesa, também podemos apertar um pequeno botão próximo ao quadrado em que nossas fichas estão mostrando quanto foi colocado ali, então o microcontrolador pode calcular o pagamento para aquele quadrado após o lançamento dos dados e exibi-lo. Ainda não tenho certeza de como irei organizar esse aspecto. Um pensamento que eu tive foi que cada pessoa será solicitada a colocar todas as suas apostas em turno para que o controlador registre onde o dinheiro de cada pessoa está antes de registrar o próximo jogador e assim por diante. Então, após o lançamento, o computador pode mostrar os pagamentos em cada quadrado e também pode manter um "dinheiro total" em execução para cada jogador.

Para uma das fotos da capa deste tutorial, eu apenas tive que usar uma foto minha tirando 5 ases na mesa de pôquer em Vegas neste verão. Heheh. Conceda-me.

Aqui está um link para a coleção completa de meus tutoriais de assembler AVR:

Etapa 1: Craps

Craps!
Craps!
Craps!
Craps!
Craps!
Craps!

Neste tutorial, construiremos apenas a parte mais simples do jogo de dados final. Isso se chama "The Pass Line" e você pode apostar nisso. Você pode aprender tudo o que precisa saber sobre a parte "linha de passagem" do jogo assistindo ao breve vídeo de instrução de 2 minutos que anexei a esta etapa.

Construiremos outro display de 4 dígitos que acompanhará o Dinheiro do Dealer da mesma forma que nosso display de 4 dígitos atual acompanha o Dinheiro do Jogador. O Dealer começará com $ 20 e o jogador começará com $ 20 (o dinheiro total possível no jogo é $ 9999 - o máximo de nossos monitores de 4 dígitos, mas precisaremos apenas de $ 20 para esta primeira parte do jogo ou caso contrário seria tedioso ao extremo e difícil de ganhar ou perder em um período de tempo razoável). Se o jogador pegar todo o dinheiro do dealer, o jogador ganha. Se o jogador perder todo o seu dinheiro, o dealer ganha.

Como você ganha ou perde dinheiro? Bem, aqueles de vocês que jogaram Craps, viram pessoas "atirando dados" na rua, ou viram jogados contra o cassino em Las Vegas, já sabem. Para o resto de vocês, deixe-me dar uma breve descrição da parte "linha de passagem" do jogo que iremos codificar hoje.

O craps é jogado há centenas de anos, desde a época das cruzadas. Foi jogado pelas tropas nas trincheiras da Segunda Guerra Mundial, foi jogado nas ruas, foi jogado em casinos e salas de jogos. Tudo começou apenas com a linha de passagem e todas as outras coisas foram adicionadas a ela mais tarde. Estaremos seguindo esta mesma progressão.

A forma como a linha de passagem funciona é esta. Você faz uma aposta e depois lança os dados. O primeiro lançamento é denominado "lançamento inicial". Se você obtiver um 2 (olhos de cobra), um 3 (ás deuce) ou um 12 (carros de caixa) no lançamento inicial, você perde sua aposta e é chamado de "dados". Se você rolar um 7 (um natural) ou um 11 (um yo ou yo-leven), você ganha. Se você lançar qualquer outro número, esse número se tornará seu "ponto". Uma vez que um "ponto" é estabelecido, você continua a lançar os dados com o objetivo de acertar o ponto novamente antes de lançar um 7. Se você obtiver seu ponto antes de um 7 ser lançado, você ganha até dinheiro. Assim, uma aposta de dólar ganha um dólar do dealer. Se você obtiver um 7 antes de seu ponto ser lançado, isso é chamado de "sete fora" e você perde sua aposta para o dealer.

Depois disso, você começa de novo. Faça uma aposta na linha de passe e lance os dados, 7 ou 11 vitórias, 2, 3 ou 12 perdas.

Existem muitos outros tipos de apostas, "não passe", "passe probabilidades", "não passe probabilidades", "venha apostar", "não venha aposta", "campo", "chifre", " caminhos difíceis ", etc etc etc. Você pode encontrar detalhes aqui:

en.wikipedia.org/wiki/Craps

Como eu disse acima, por enquanto, estaremos codificando apenas a parte da linha de passagem do jogo, que é tudo o que eles tinham no dia em que as crianças jogavam dados contra a parede pelo dinheiro do lanche uns dos outros e é aqui que vamos começar.

No entanto, antes de começarmos a codificar as coisas, vamos construir a tela de caixa do negociante. Para isso, quero usar uma das telas maiores de 4 dígitos que você pode obter no Sparkfun ou em outro lugar. De agora em diante, não vou listar materiais sobre esses tutoriais. Se você realmente construiu tudo comigo, então já sabe onde obter os materiais e o que são. É inútil para mim listá-los ou quanto custam.

Então, vamos pegar uma de nossas placas de prototipagem, um grande display de 4 dígitos, outro ATmega328p para controlar esse display e construí-lo como fizemos com o rolo de dados e o display do jogador antes. Também estaremos conectando cabeçalhos para alimentação, para programação e para comunicações TWI, assim como os outros.

Etapa 2: exibição de dinheiro do revendedor

Mostrador de caixa do revendedor
Mostrador de caixa do revendedor
Exibição de caixa do revendedor
Exibição de caixa do revendedor
Mostrador de caixa do revendedor
Mostrador de caixa do revendedor

Construímos a tela do dealer da mesma forma que fizemos com a tela de 4 dígitos do jogador no último tutorial. As únicas diferenças são que ele é maior e tem menos pinos, então iremos organizá-lo e conectá-lo de maneira diferente.

Anexei uma foto da fiação deste monitor. Você pode ver que ele é maior e tem menos pinos do que nosso display playercash. A imagem é da página do sparkfun onde obtive o display e mostra quais pinos são alimentados para cada dígito e quais pinos controlam cada um dos segmentos em um dígito.

Como de costume, você deve começar conectando o monitor à placa de ensaio de prototipagem e testar cada segmento para ter certeza de que entendeu como ele está conectado. Em seguida, você deve conectá-lo aos pinos de um microcontrolador AVR em sua placa de ensaio e executá-lo de lá até que tenhamos todo o nosso código funcionando neste tutorial. Finalmente, no final, você deve construir a placa externa e soldá-la. Então, quando você testar o produto final, saberá que quaisquer problemas vêm de seu trabalho de solda e corte e não do código. Além disso, não se esqueça do conhecido axioma da carpintaria "meça duas vezes e corte uma vez", ou no caso de fazer placas de circuito: "corte duas vezes, solde uma vez". Como você pode ver pela foto, finalmente desisti e comprei o acessório Dremel perfeito para esse tipo de trabalho. Um "Conjunto de pontos de diamante". Custou 5 dólares, mas isso é muito menos do que o custo da Terapia de Controle da Raiva que vem com o meu corte de corte muitas vezes consecutivas.

Estou usando resistores de 330 ohms para esta tela. Os pinos COM vão do resistor para GND e a energia vai para qualquer segmento que você deseja exibir. Vou usar PC0 a PC3 para os pinos COM e PB0, PB1, PB2, PB3, PB4, PD5, PD6 e PD7 para os segmentos.

Aqui está a chave para maximizar suas chances de acertar:

  1. mapear o circuito
  2. corte o circuito
  3. verifique sua fiação
  4. conecte os resistores, as tampas e o oscilador de cristal
  5. verifique as conexões e fiação novamente
  6. conecte os fios externos
  7. conecte o microcontrolador
  8. verifique a fiação novamente
  9. conecte o display de 4 dígitos
  10. verifique cada dígito com um par de fios da placa de ensaio
  11. coloque-o de lado e escreva o código, sabendo que provavelmente você terá que ajustar as coisas mais tarde e esperando não ter coberto uma conexão que precisa ser cortada.

Mostrei uma série de fotos do meu trabalho de cabeamento. Lembre-se de que você é livre para conectar o seu da maneira que quiser. É muito provável que você encontre um mapa melhor do que eu e que você deva usá-lo. Nada nestes tutoriais depende de como seus componentes são conectados, desde que tenham as portas de saída corretas. Oque me lembra. Observe que agora há dois cabeçalhos indo para SDA e dois indo para SCL? Por que você acha que fizemos isso?

Agora, como você pode ver pelo código anexado no final do tutorial, simplesmente recortei e colei o código da tela do player do último tutorial em um novo arquivo para a tela do dealer. Então, eu mudei a tabela de pesquisa de "segmentos" para corresponder ao novo mapa de pinos, observando que para esta tela os pinos "com" são aterrados e os pinos de segmento são 5V ao invés do contrário como era para a outra tela. Também mudei a inicialização das portas para refletir a nova fiação, mudei o endereço do mostrador de dealercash para 0b1000000 para que o rolador de dados possa falar com ele, mudei a sub-rotina "ciclo" para que desligue o Pinos "com" de PC0 a PC3 quando deseja alimentar um segmento específico e mudei o "dígito" que é exibido, pois a nova fiação tem os dígitos na ordem oposta (se você deixou como estava e tentou exibi-lo 1234 teria aparecido como 4321 em vez).

Aqui está o novo mapa de registro:

(PD7, PD6, PD5, PB4, PB3, PB2, PB1, PB0) = (ponto decimal, c, g, b, f, a, e, d)

onde 1 é ON e 0 é OFF.

Agora teste o visor, primeiro definindo o valor inicializado do visor para vários números para que, quando ligar, os mostre. Isso informará se tudo está funcionando corretamente.

Em seguida, modifique o código do diceroller para que ele use o novo endereço para o escravo, conecte-os e execute-o. Deve agir exatamente como o que fizemos no último tutorial, exceto que os lançamentos de dados agora aparecem na nova tela.

Excelente! Agora estamos prontos para escrever o novo código do rolo de dados para que ele se comunique com o visor do jogador e do crupiê.

Etapa 3: esboço do programa

Esboço do programa
Esboço do programa
Esboço do programa
Esboço do programa
Esboço do programa
Esboço do programa

A maneira como o código funcionará em nosso jogo é manter o rolador de dados como mestre e adicionar a tela do crupiê como um escravo adicional. O rolo de dados controlará o jogo e enviará as trocas em dinheiro resultantes para o dealer e o jogador exibe após cada lançamento. Por enquanto, teremos apenas a aposta de linha de passe sendo $ 10 de cada vez, para que não tenhamos que nos complicar ainda com o jogador mudando sua aposta. Mais tarde, assim que tivermos a mecânica a funcionar, iremos adicionar outro controlador que será um mestre adicional que controlará as apostas e os pagamentos e o nosso rolo de dados continuará a ser um mestre, mas apenas utilizado para lançar os dados. Isso nos permitirá entrar em arbitragem TWI, colisões e outros aspectos importantes da comunicação serial quando você tem vários mestres e escravos. Também estaremos adicionando uma série de monitores de 7 dígitos únicos com botões sob eles que nos permitirão apostar em outros tipos de lançamentos, mas tudo isso virá em tutoriais futuros. Por enquanto, queremos apenas o lançador de dados como mestre e os dois monitores como escravos. Quando apertamos o botão, o código decidirá se devemos pagar um natural, tirar dinheiro de um jogo de dados ou ramificar para uma série de lançamentos de "pontos" até uma vitória ou um sete-out.

Vamos primeiro escrever as rotinas escravas. Eles são simples, pois tudo o que farão é observar a linha SDA em busca de seu endereço; se forem chamados, lerão o novo número para exibi-lo e exibi-lo. Isso é tudo! Eles nem mesmo precisam responder ao mestre, já que o mestre manterá o controle de seus totais e fará todos os cálculos de pagamento antes de atualizá-los. Em tutoriais futuros, teremos escravos escrevendo de volta para o mestre (por exemplo, quando temos telas de 7 dígitos únicos com botões para o valor da aposta, eles terão que dizer ao mestre quanto está sendo apostado em cada tela e, portanto, dirija-se a eles com um endereço + chamada de leitura com o mestre em "modo receptor mestre"), mas chegaremos a isso no devido tempo.

Por enquanto, tudo é instigado pelo pressionamento do botão de lançamento de dados, seguido de um cálculo ou mais pressionamentos de botão e, finalmente, uma mensagem para cada um dos monitores com seus novos totais. Haverá um teste após cada pagamento para determinar se o jogador ganhou ou perdeu, em outras palavras, se o dinheiro do dealer torna-se zero após um lançamento, ou se o dinheiro do jogador torna-se zero após um lançamento (nem o dealer ou o jogador pode ficar negativo, pois eles só poderão apostar $ 10 ou então o que sobrar se for menos de $ 10).

Então é assim que vai funcionar. Vamos começar a programar.

Etapa 4: Código Mestre de Comunicações

Código Mestre de Comunicações
Código Mestre de Comunicações

Agora podemos escrever a rotina de comunicação do rolo de dados. Também é quase idêntico ao que escrevemos da última vez, exceto que estaremos nos comunicando com dois escravos diferentes, em vez de apenas um. Observe que para cada um dos escravos usamos um endereço diferente. Você mesmo deve modificar o código e então simplesmente testá-lo com cada endereço e certificar-se de que funciona como o último tutorial, exceto com cada exibição separada.

Anexarei o código de cada componente que simplesmente exibe o resultado do teste para que possa ser usado para fazer os visores funcionarem corretamente e verificar a fiação.

Codificar o jogo não apresenta nada de novo no que diz respeito a comandos em linguagem assembly ou componentes de microcontroladores AVR e, portanto, não sinto que preciso examiná-los linha por linha. Você provavelmente já percebeu que, quando introduzimos algo novo, eu passo por cada linha nos mínimos detalhes a ponto de irritá-lo, se não colocá-lo para dormir. Por outro lado, não o farei se não houver nada de novo introduzido. Esse é o caso hoje. Então eu acho que você está preparado agora para brincar com o código, ler o código, analisar o código, entender o código, criticar o código, zombar do código e rir do cara que escreveu o código. Então, vou deixar você ir em frente e fazer isso. É quase certo que você encontrará muitos lugares que pode melhorar ou pelo menos simplificar o que escrevi.

Como de costume, anexei a versão final do código para os dois monitores e o diceroller na próxima etapa, junto com um vídeo meu testando a coisa.

Etapa 5: Código Final e Vídeo

Anexei o vídeo e os 3 programas. Você notará que pode corrigir a aposta e o crupiê inicial e o dinheiro do jogador no topo do programa com declarações.equ.

No próximo tutorial adicionaremos a possibilidade de apostar em coisas diferentes que tornarão o jogo mais emocionante. O interessante sobre o Craps moderno é que você tem uma infinidade de maneiras diferentes de apostar e tentar maximizar suas chances. Na verdade, Craps é o jogo de maiores probabilidades no Casino! … SE você souber como jogar. Por outro lado, se você não sabe como jogar, então ele se torna um dos jogos de menor probabilidade.

Assim que tivermos mais coisas em que apostar nosso dinheiro, aumentarei a quantidade total de dinheiro no jogo.

Eu deveria ser divertido!

Vejo você na próxima vez!

Recomendado: